Java StarLogo
2.0
english
`turtle`


`observer`
globals [pattern pwrap gen numalive live0 live1 live2 live3 live4 live5 live6 live7 live8 empty0 empty1 empty2 empty3 empty4 empty5 empty6 empty7 empty8]
patches-own [alive pan]

to startup
  set gen 0
  set pwrap true
  slife
  clearplot
  pp1
  ppd
  setppc green
  setplot-title "Cellular Automata"
  setplot-ylabel "cells alive"
  setplot-xlabel "time"
  setplot-yrange 0 (screen-height * screen-width / 2)
  setplot-xrange 0 200
end
  
to disp
   no-display
   ask-patches [
      ifelse alive [setpc red] [setpc black]
   ]
   if (not pwrap) 
      [ask-patches 
         [if (((abs ycor) = screen-half-height) or 
              ((abs xcor) = screen-half-width))
             [setpc black]
         ]
      ]
   display
   set numalive (count-patches-with [pc != black])
   plot numalive
end

to tep
   ask-patches [
     let [:count 0]
     if (pc-at 1 1) != black [set :count :count + 1]
     if (pc-at 1 0) != black [set :count :count + 1]
     if (pc-at 1 -1) != black [set :count :count + 1]
     if (pc-at 0 1) != black [set :count :count + 1]
     if (pc-at 0 -1) != black [set :count :count + 1]
     if (pc-at -1 1) != black [set :count :count + 1]
     if (pc-at -1 0) != black [set :count :count + 1]
     if (pc-at -1 -1) != black [set :count :count + 1]
     ifelse pc = black
        [case :count
            [0 [set alive empty0]
             1 [set alive empty1]
             2 [set alive empty2]
	     3 [set alive empty3]
             4 [set alive empty4]
             5 [set alive empty5]
             6 [set alive empty6]
             7 [set alive empty7]
             8 [set alive empty8]
            ]
        ]
        [case :count
            [0 [set alive live0]
             1 [set alive live1]
             2 [set alive live2]
             3 [set alive live3]
             4 [set alive live4]
             5 [set alive live5]
             6 [set alive live6]
             7 [set alive live7]
             8 [set alive live8]
            ]
        ]
   ]
end

to pup
  ask-patches [set pan (pc-at 0 -1)]
  ask-patches [setpc pan]
end

to pdown
  ask-patches [set pan (pc-at 0 1)]
  ask-patches [setpc pan]
end

to pright
  ask-patches [set pan (pc-at -1 0)]
  ask-patches [setpc pan]
end

to pleft 
  ask-patches [set pan (pc-at 1 0)]
  ask-patches [setpc pan]
end

to prand
  ask-patches [ifelse (random 100) < density 
                 [setpc red]
                 [setpc black]
              ]
end

to pplive
   let [:out 111111111]
   if live0 [set :out :out + 1]
   if live1 [set :out :out + 10]
   if live2 [set :out :out + 100]
   if live3 [set :out :out + 1000]
   if live4 [set :out :out + 10000]
   if live5 [set :out :out + 100000]
   if live6 [set :out :out + 1000000]
   if live7 [set :out :out + 10000000]
   if live8 [set :out :out + 100000000]
   output :out
end

to ppempty
   let [:out 111111111]
   if empty0 [set :out :out + 1]
   if empty1 [set :out :out + 10]
   if empty2 [set :out :out + 100]
   if empty3 [set :out :out + 1000]
   if empty4 [set :out :out + 10000]
   if empty5 [set :out :out + 100000]
   if empty6 [set :out :out + 1000000]
   if empty7 [set :out :out + 10000000]
   if empty8 [set :out :out + 100000000]
   output :out
end

to crules
   set empty0 false
   set empty1 false
   set empty2 false
   set empty3 false
   set empty4 false
   set empty5 false
   set empty6 false
   set empty7 false
   set empty8 false
   set live0 false
   set live1 false
   set live2 false
   set live3 false
   set live4 false
   set live5 false
   set live6 false
   set live7 false
   set live8 false
end

to slife
   set empty0 false
   set empty1 false
   set empty2 false
   set empty3 true
   set empty4 false
   set empty5 false
   set empty6 false
   set empty7 false
   set empty8 false
   set live0 false
   set live1 false
   set live2 true
   set live3 true
   set live4 false
   set live5 false
   set live6 false
   set live7 false
   set live8 false
end

to patternt
  let [:patternt "none"]
  case pattern
    [1 [set :patternt "glider"]
     2 [set :patternt "LWSS"]
     3 [set :patternt "MWSS"]
     4 [set :patternt "HWSS"]
     5 [set :patternt "spaceship"]
     6 [set :patternt "Mobius"]
     7 [set :patternt "10 line"]
     8 [set :patternt "cross"]
     9 [set :patternt "pi"]
     10 [set :patternt "beehive"]
     11 [set :patternt "puffer"]
     12 [set :patternt "long life"]
    ]
    output :patternt
end

to pplace
  case pattern
    [1 [cg ct
        stamp-at 0 0 red 
        stamp-at 0 1 red
        stamp-at 1 2 red
        stamp-at 1 0 red
        stamp-at 2 0 red]
     2 [cg ct
        stamp-at 0 0 red
        stamp-at 0 1 red
        stamp-at 0 2 red
        stamp-at 1 3 red
        stamp-at 1 0 red
        stamp-at 2 0 red
        stamp-at 3 0 red
        stamp-at 4 1 red
        stamp-at 4 3 red]
     3 [cg ct
        stamp-at 0 0 red
        stamp-at 0 1 red
        stamp-at 0 2 red
        stamp-at 1 3 red
        stamp-at 1 0 red
        stamp-at 2 0 red
        stamp-at 3 0 red
        stamp-at 3 4 red
        stamp-at 4 0 red
        stamp-at 5 1 red
        stamp-at 5 3 red]
     4 [cg ct
        stamp-at 0 0 red
        stamp-at 0 1 red
        stamp-at 0 2 red
        stamp-at 1 0 red
        stamp-at 1 3 red
        stamp-at 2 0 red
        stamp-at 3 0 red
        stamp-at 3 4 red
        stamp-at 4 0 red
        stamp-at 4 4 red
        stamp-at 5 0 red
        stamp-at 6 1 red
        stamp-at 6 3 red]
     5 [cg ct
        stamp-at -2 1 red
        stamp-at -1 0 red
        stamp-at -1 2 red
        stamp-at 0 0 red
        stamp-at 0 2 red
        stamp-at 1 0 red
        stamp-at 1 2 red
        stamp-at 2 1 red]
     6 [cg ct
        stamp-at -3 -3 red
        stamp-at -3 -2 red
        stamp-at -3 -1 red
        stamp-at -2 -3 red
        stamp-at -2 -2 red
        stamp-at -2 -1 red
        stamp-at -1 -3 red
        stamp-at -1 -2 red
        stamp-at -1 -1 red
        stamp-at 0 0 red
        stamp-at 0 1 red
        stamp-at 0 2 red
        stamp-at 1 0 red
        stamp-at 1 1 red
        stamp-at 1 2 red
        stamp-at 2 0 red
        stamp-at 2 1 red
        stamp-at 2 2 red]
     7 [cg ct
        stamp-at -4 0 red
        stamp-at -3 0 red
        stamp-at -2 0 red
        stamp-at -1 0 red
        stamp-at 0 0 red
        stamp-at 1 0 red
        stamp-at 2 0 red
        stamp-at 3 0 red
        stamp-at 4 0 red
        stamp-at 5 0 red]
     8 [cg ct
        stamp-at 0 0 red
        stamp-at 1 1 red
        stamp-at -1 1 red
        stamp-at 1 -1 red
        stamp-at -1 -1 red
        stamp-at 2 2 red
        stamp-at -2 2 red
        stamp-at 2 -2 red
        stamp-at -2 -2 red]
     9 [cg ct
        stamp-at -1 -1 red
        stamp-at -1 0 red
        stamp-at -1 1 red
        stamp-at 0 1 red
        stamp-at 1 1 red
        stamp-at 1 0 red
        stamp-at 1 -1 red]
     10 [cg ct
         stamp-at 0 0 red
         stamp-at 0 2 red
         stamp-at 0 3 red
         stamp-at -1 0 red
         stamp-at 1 0 red
         stamp-at -1 -1 red
         stamp-at 1 -1 red
         stamp-at 0 -2 red]
     11 [cg ct
         stamp-at -2 0 red
         stamp-at 2 0 red
         stamp-at -1 -1 red
         stamp-at 0 -1 red
         stamp-at 1 -1 red
         stamp-at 0 -2 red
         stamp-at -1 1 red
         stamp-at 0 1 red
         stamp-at 1 1 red
         stamp-at -2 2 red
         stamp-at -1 2 red
         stamp-at 0 2 red
         stamp-at 1 2 red
         stamp-at 2 2 red]
     12 [cg ct
         stamp-at -1 0 red
         stamp-at -1 1 red
         stamp-at 0 1 red
         stamp-at 1 0 red
         stamp-at 1 -1 red
         stamp-at 2 -1 red]
    ]
end


`information`
This model allows the user to explore cellular automata models.

A (very) quick overview:

What are cellular automata?
Cellular automata treat the world as a checkerboard of squares (patches!)
where each square can be either on/alive (red) or off/dead (black). At 
each turn every square counts how many of its eight neighbors are on 
and then based on this number consults a rule that tells it to turn on
or off.  They're are actually two rules, on for if the square is 
currently off and on for if its currently on.

About Neighbors :

***
*X*
***

(in the above if X is the square in question then the *'s are its eight
neighbors)

About Rules :
See setting the rules section of the How to use the model below.  Try 
setting up a checkerboard and performing the rules yourself.  You should
be able to match the behavior of the patchs (at least slowly with simple
patterns).

How to use the model :

	The control buttons and monitors :
          The step button runs the model through one gerneration, while
              the go button runs the model continuosly.
          The clear button clears all patches to off/dead (black)
          The random-place button randomly turns on a number of patches
              determined by the density slider.
          The generations monitor counts the number of generations
              the model has gone throug, it is resettable with the 
              clear-gen button
          The alive monitor shows how many patches are on/alive
              (this number is also plotted in the plot window)
	
	Setting the rules :
          The clear-rules button sets the value of all rules to off
          The life-rule button sets the rules to play Life, the most
              famous cellular automata model.
          The live rule and empty rule monitors show the rules currently
              in effect for the model.  The live rule displays the rule 
              for a patch that is on (red).  The empty rule displays the
              rule for a patch the is off (black).  The format is as 
              follows, they show the neighbor count from 8 neighbors down
              to zero neighbors (ignore the E8 on the end) where 1 
              sigfnifies that the patch should turn off/die (turn black)
              and 2 signifies that the patch should turn off/die (turn
              red).  Thus if a patch is alive(red) and the live rule is
                                    1 1 1 1 1 2 2 1 1 
              which corresponds to  8,7,6,5,4,3,2,1,0 neighbors, then if
              it has either 2 or 3 neighbors alive it will stay alive, if
              it has any other number of neighbors then it will die.
              Similarly if a patch is empty(black) and the empty rule is
                                    1 1 1 1 1 2 1 1 1
              which corresponds to  8,7,6,5,4,3,2,1,0 neighbors, then if
              it has 3 neighbors it will turn alive(red) and if it has 
              any other number of neighbors it will remain empty.
           The rules are changed with the Set Live Rule and Set Empty
              Rule buttons. Click the button for the appropriate number 
              of neighbors (under Set Empty Rule to change the empty
              rule and Set Live Rule to change the live rule) to switch
              the behavior for that number of neighbors.  Thus if the 
              live rule is originally 2 1 1 1 1 1 1 1 1 then clicking on
              the 8 and 4 buttons under Set Live Rule will change it to
              1 1 1 1 2 1 1 1 1.
               
        Drawing your own pattern :
          You can draw new on patches (or kill of already living 
          patches) at any time.  The model treats pure black (0) patches
          as off/dead and any other color as an on/live patch. 

	Picking a pre-defined patter :
          To chose a pre-defined patters, click the pattern select 
          button till the name of the desired pattern appears in the 
          pattern monitor.  When the name of the desired patter appears 
          push the pattern place button to put that pattern on the patch-
          canvas.  Note, the patterns are chosen mostly for the behavior
          under the Life rules.

	Paning :
          Quite often the center of activity of the cellular automata
          will move off to the corner of the screen and you may wish
          to recenter it. To do so stop the simulation by pressing the
          stop all button on the control window or deslecting the go 
          button if it is selected and then using the up, down, left,
          and right buttons to center the screen as desired. Once the 
          screen is in the desired posistion press go to start the 
          simulation back up.

	The wrap button :
          The wrap button can be used to select whether or not things 
          that move off of one side of the screen will reappear on the
          other.  When wrap is true they do, when false they don't.  

Play around with various patterns and rules, change the patch canvas size
and see what kinds of behaviors you can create.  A quick search on the 
web for game of Life and patterns will give you literally thoasands of
neat patterns to try.

Some places to look for more information on cellular automata :

	An introduction with pictures
	http://www.mirwoj.opus.chelm.pl/whatis_life.html     
	
	A wonderfull listing of various rules and their long term 
        tendencies.  Try a few.
	http://www.mirwoj.opus.chelm.pl/rullex_life.html    

        A place to find some patters to play with
        www.radicaleye.com/lifepage/

        There are a great many additional resources on the web!


`interface`
SLCanvas
top-left 13 333

SLButton
turtle-or-observer? observer
top-left 353 261
width-height 40 30
name "wrap"
line-to-run "set pwrap not pwrap"
forever? false
button-number 32
show-name? true
whichip 14

SLButton
turtle-or-observer? observer
top-left 63 35
width-height 55 30
name "clear-plot"
line-to-run "ppreset setplot-yrange 0 (screen-height * screen-width / 2)"
forever? false
button-number 31
show-name? true
whichip 16

SLButton
turtle-or-observer? observer
top-left 229 212
width-height 40 30
name "go up"
line-to-run "pup"
forever? false
button-number 26
show-name? true
whichip 17

SLButton
turtle-or-observer? observer
top-left 259 249
width-height 40 30
name "right"
line-to-run "pright"
forever? false
button-number 28
show-name? true
whichip 18

SLButton
turtle-or-observer? observer
top-left 258 175
width-height 40 30
name "left"
line-to-run "pleft"
forever? false
button-number 27
show-name? true
whichip 19

SLButton
turtle-or-observer? observer
top-left 288 212
width-height 40 30
name "down"
line-to-run "pdown"
forever? false
button-number 29
show-name? true
whichip 20

SLMonitor
top-left 25 223
width-height 65 36
name "generations"
list-to-run "gen"
digits 0
delay 0.1
monitor-number 4
show-name? true
whichip 48
onewhichip 49

SLMonitor
top-left 388 260
width-height 44 36
name "wrap"
list-to-run "pwrap"
digits 0
delay 1.0
monitor-number 5
show-name? true
whichip 50
onewhichip 51

SLButton
turtle-or-observer? observer
top-left 250 39
width-height 40 30
name "E3"
line-to-run "set empty3 not empty3"
forever? false
button-number 16
show-name? true
whichip 21

SLButton
turtle-or-observer? observer
top-left 221 39
width-height 40 30
name "E2"
line-to-run "set empty2 not empty2"
forever? false
button-number 17
show-name? true
whichip 22

SLButton
turtle-or-observer? observer
top-left 162 0
width-height 40 30
name "L0"
line-to-run "set live0 not live0"
forever? false
button-number 2
show-name? true
whichip 23

SLButton
turtle-or-observer? observer
top-left 395 0
width-height 40 30
name "L8"
line-to-run "set live8 not live8"
forever? false
button-number 10
show-name? true
whichip 24

SLButton
turtle-or-observer? observer
top-left 366 0
width-height 40 30
name "L7"
line-to-run "set live7 not live7"
forever? false
button-number 8
show-name? true
whichip 25

SLButton
turtle-or-observer? observer
top-left 338 0
width-height 40 30
name "L6"
line-to-run "set live6 not live6"
forever? false
button-number 7
show-name? true
whichip 26

SLButton
turtle-or-observer? observer
top-left 309 0
width-height 40 30
name "L5"
line-to-run "set live5 not live5"
forever? false
button-number 9
show-name? true
whichip 27

SLButton
turtle-or-observer? observer
top-left 280 0
width-height 40 30
name "L4"
line-to-run "set live4 not live4"
forever? false
button-number 6
show-name? true
whichip 28

SLButton
turtle-or-observer? observer
top-left 250 0
width-height 40 30
name "L3"
line-to-run "set live3 not live3"
forever? false
button-number 5
show-name? true
whichip 29

SLButton
turtle-or-observer? observer
top-left 221 0
width-height 40 30
name "L2"
line-to-run "set live2 not live2"
forever? false
button-number 4
show-name? true
whichip 30

SLButton
turtle-or-observer? observer
top-left 192 0
width-height 40 30
name "L1"
line-to-run "set live1 not live1"
forever? false
button-number 3
show-name? true
whichip 31

SLButton
turtle-or-observer? observer
top-left 367 39
width-height 40 30
name "E7"
line-to-run "set empty7 not empty7"
forever? false
button-number 12
show-name? true
whichip 32

SLMonitor
top-left 352 82
width-height 130 36
name "Live Rule (8 downto 0)"
list-to-run "pplive"
digits 0
delay 1.0
monitor-number 2
show-name? true
whichip 52
onewhichip 53

SLButton
turtle-or-observer? observer
top-left 395 39
width-height 40 30
name "E8"
line-to-run "set empty8 not empty8"
forever? false
button-number 11
show-name? true
whichip 33

SLButton
turtle-or-observer? observer
top-left 338 39
width-height 40 30
name "E6"
line-to-run "set empty6 not empty6"
forever? false
button-number 13
show-name? true
whichip 34

SLButton
turtle-or-observer? observer
top-left 310 39
width-height 40 30
name "E5"
line-to-run "set empty5 not empty5"
forever? false
button-number 14
show-name? true
whichip 35

SLMonitor
top-left 389 82
width-height 130 36
name "Empty Rule (8 downto 0)"
list-to-run "ppempty"
digits 0
delay 1.0
monitor-number 1
show-name? true
whichip 54
onewhichip 55

SLButton
turtle-or-observer? observer
top-left 162 39
width-height 40 30
name "E0"
line-to-run "set empty0 not empty0"
forever? false
button-number 19
show-name? true
whichip 36

SLButton
turtle-or-observer? observer
top-left 280 39
width-height 40 30
name "E4"
line-to-run "set empty4 not empty4"
forever? false
button-number 15
show-name? true
whichip 37

SLButton
turtle-or-observer? observer
top-left 320 82
width-height 59 30
name "clear-rules"
line-to-run "crules"
forever? false
button-number 25
show-name? true
whichip 38

SLButton
turtle-or-observer? observer
top-left 191 39
width-height 40 30
name "E1"
line-to-run "set empty1 not empty1"
forever? false
button-number 18
show-name? true
whichip 39

SLMonitor
top-left 143 242
width-height 78 36
name "pattern"
list-to-run "patternt"
digits 0
delay 1.0
monitor-number 6
show-name? true
whichip 56
onewhichip 57

SLButton
turtle-or-observer? observer
top-left 321 162
width-height 48 30
name "life-rule"
line-to-run "slife"
forever? false
button-number 23
show-name? true
whichip 40

SLButton
turtle-or-observer? observer
top-left 64 227
width-height 55 30
name "clear-gen"
line-to-run "set gen 0"
forever? false
button-number 30
show-name? true
whichip 43

SLSlider
top-left 97 91
width-height 91 25
name "density"
variable "density"
min-value 0
max-value 100
current-value 27
slider-number 0
show-name? false

SLTextWidget
top-left 112 1
width-height 40 55
textwidth 22
linenums 3
words "Set\nLive\nRule"
drawBorder false
textwidget-number 1

SLTextWidget
top-left 112 42
width-height 40 55
textwidth 30
linenums 3
words "Set\nEmpty\nRule"
drawBorder false
textwidget-number 2

SLTextWidget
top-left 119 206
width-height 78 40
textwidth 74
linenums 2
words "Built in patterns\n"
drawBorder false
textwidget-number 4

SLTextWidget
top-left 260 213
width-height 40 40
textwidth 19
linenums 2
words "Pan\n"
drawBorder false
textwidget-number 3

SLButton
turtle-or-observer? observer
top-left 61 94
width-height 78 34
name "random place"
line-to-run "prand"
forever? false
button-number 33
show-name? true
whichip 45

SLLineWidget
top-left 184 87
width-height 106 65
id 1
order 1
type 1
title "Cellular Automata"
delay-string "1.0"
xlabel "time"
ylabel "cells alive"
grid false
connected true
autoscaletrue
location 0 0
wizard-on false

SLMonitor
top-left 135 98
width-height 51 36
name "alive"
list-to-run "numalive"
digits 0
delay 0.1
monitor-number 3
show-name? true
whichip 58
onewhichip 59

SLButton
turtle-or-observer? observer
top-left 26 14
width-height 40 30
name "step"
line-to-run "tep disp set gen gen + 1"
forever? false
button-number 21
show-name? true
whichip 15

SLButton
turtle-or-observer? observer
top-left 20 59
width-height 48 36
name "go"
line-to-run "tep disp set gen gen + 1"
forever? true
button-number 22
show-name? true
whichip 46

SLButton
turtle-or-observer? observer
top-left 26 159
width-height 40 30
name "clear"
line-to-run "set numalive 0 set gen 0 cg ct"
forever? false
button-number 20
show-name? true
whichip 44

SLButton
turtle-or-observer? observer
top-left 26 113
width-height 40 30
name "setup"
line-to-run "startup"
forever? false
button-number 36
show-name? true
whichip 47

SLButton
turtle-or-observer? observer
top-left 180 198
width-height 74 30
name "pattern select"
line-to-run "ifelse pattern = 12 [set pattern 1] [set pattern pattern + 1]"
forever? false
button-number 35
show-name? true
whichip 41

SLButton
turtle-or-observer? observer
top-left 147 166
width-height 73 30
name "pattern place"
line-to-run "pplace"
forever? false
button-number 34
show-name? true
whichip 42


`turtle shapes`
[encoded data, 10920 characters]
XbDPdBUPFQAAFQ8V

`template`
null

`settings`
patch-size 8
num-shapes 256
screen-half-width 25
screen-half-height 25
interface-window-xcor 110
interface-window-ycor 73
interface-window-size 753 431
output-window-xcor 465
output-window-ycor 62
output-window-width 397
output-window-height 324
info-window-xcor 397
info-window-ycor 191
info-window-width 542
info-window-height 424
control-center-xcor 19
control-center-ycor 12
control-center-width 402
control-center-height 537
turtle-command-center-height 150
observer-command-center-height 150

`string table`
H4sIAAAAAAAAAB2MOw7CMBAFn1BwFNHADXwEOAKioSBVCmrHrJOVNrblD+fHoZni
6c0AOOPyIJEqJul7LWEzxeBk25S1Ef4SusJbow+eoBbhDyV0r/c0oRv/fO4ccjSW
8soRagwz14z+dtXCzTraFHLGITL6mWjdqypW51ppkOCXdnP0A7HhmhSNAAAAAAAA
jQ==

`symbol table`
H4sIAAAAAAAAAGNgYGBiYCkpKk1lYE1LzClOBQBgXN0IEQAAAAAAABE=

`double table`
H4sIAAAAAAAAAGNgYJC1/8AABg4MUNq7AULrQfkcEHo/VJ3jrNr1MiB6+vUWsLwW
VJ0OlDaA0oZQ2ghKG0NpEyhtCqUFoLQIlJaA0jJQWgFKK0FpFSitBqU1IPQBqPsP
QN17AGqu/c6ZIDALANkFdK3sAAAAAAAA7A==

`list table`
H4sIAAAAAAAAALVWbZLTMAyVEztJ06Tp5+6m8JMZLrAHYDgFB9j/XIFfHIHhJ8fh
KBwDKX5uHp7stIWhM973rMiSLMlei8iziPRO/xQirowoOneKhVeuw+koXJQn/KnQ
YF0JmQOazCuauU/0zS3wy1zXhMzOH8jfwV02F54v2LPRk2xDexrAbS9bcNvDDtxs
7cErHQfwWscR3PJxIl+efAXyVZGvmnQb8rUiXy35WpOvzrjAD/Y8+RPyzbKUk0zP
LcheuLb6OxQxlqQfEFcFXY2t/BXjer+d4ndff0w6w8cPU9zfv32xmNVOTfZ6qkWL
OrzEGkz2drC3h70D7B1h7wR778q41wa4ApbAFrgGdsAeuAEOwC1wB9wDD8Aj8AR8
AD4Cn67EJP8YkyAmuTOms6fz6mM97ZxbPUuPGvvYa8HHPqt87Mfaxxo1Pvbhysce
bH2s49rHOnaKg5r/nJ8/vivA7VtBPOkUOX9lvWTryyu2SuKe7HhaW/4nf5Mf8pfk
gewHsunviEMWYro3Dk/yQPKK/FZk3+6bMX2juyXxgmKVG+IuKO6LP8UzRgkciQfw
kXRG0hlJJ5BOIJ2QdP4y30u9nPevI550asU3lLMz8THLpSzEd2uPc58l3izY4jpe
9pTlL+T7QKyXfWe5HyFf8fqFXuE8uzymPOcUR+te7y9JvZrl0LFvssV2hWJfcz04
13nvXLN1y145nwvniHuQey3x7o7cLuWzSFzmvrUf97ETeg/Gz9N8q5MWfCAbdqds
wS2+J3DL6yN4q/wB3HrlBN4oP4LbeTmA272wB7d4d+BH5RtwexsM4Pbe6MH3yjvw
XnkDvlO+Bt8oX8n8PutSzlIe3bxvKeZ3U3r7Jlmet3QmLc9vU36QR/5fkGxPc5lr
bD8Hfa6PI72KZJXMd0JJPqf5b/vGEe8ADAAAAAAMAA==

`bytecodes`
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
zgkvjAkvAAAAAC8J

`observer world`
H4sIAAAAAAAAAHXP2wrCMAwG4Oh0zvPZax/Bs+KVj7KJYQ7mLFud+PYmaRAELQS+
0IS/hUF4PxeYl5jPCxtZDE/wOUdomfRun8klRkt9DfwUs9heySE0+M5gJqNtWf7c
BlQzmoisxdxN1M0zjwyhAl4sW1UIssctSpMSqfOgzlpIjnDJW44rou+4JjYcN5Ik
3BKbjjtiy3HPL3M8EDvg483YF2d01RzSU3NKX80xAzXnDNUcNFJz0ljNURM1Z03l
p1RV+Zs2zhUt8L77f/Vz5g0e4ld1ugEAAAAAAbo=

`patch world`
[encoded data, 8125 characters]

`turtle world`
H4sIAAAAAAAAAE2Ouw7CMAxFr0QfCBATIwMDUwcGYGDkUxoaq6kUJVFiVPgaPhXc
8hB38TmSfWUsa75GtrRJrJjqM355oLDkWjbCJ+SXSKQFt5gF67nvdEssfkQ5eCAn
skPeeOuj4BrZvRlpgflY/tc2lXXtexfE9siTUYEEK2S3902GSW/8+EeRzGfzgNKQ
0p1rRVbfP5+SYb4ATYOGr8sAAAAAAADL

