Update 12/10/14 I am adding a collection of mini-demos about using a mask in FB. It is called 'Power of the Mask' and is posted in a new message below the original one'. Hope you like it. Also, I replaced the 'Love and Letter-bots' code with the essentially the same code, but tweaked for better hearts beating :-)
CAUTION: while there is no problem with selecting/copying this code and pasting it in an editor and running it, there IS a problem with downloading the file as a file -- that trashes the mask data, and the program does not work. So, select, copy, paste only!
For a new project, I am offering two features that get along fairly well -- screen masks and letter-bots. Where is this project going? -- I am working on that :-)
In a recent Tips and Tricks post, I looked at the graphics magenta screen which acts as a mask for whatever image is underneath. But this is one of many masks that can jazz up a graphics display. If a coder creates an array pattern matching the screen, it is possible to refer to that pattern, without printing it directly, to get masked effects.
The letter-bots are the simplest bots I could think of. Each bot -- represented by some character -- acts independently to move about. Currently, the letter-bots move this way: continue in same direction if possible, but sometimes change, choose another direction, if possible, with equal chances if blocked. And if no move possible, then sit there twiddling non-existent thumbs.
It is interesting how the simple letter-bots show a different emergent behavior, when moving in groups, than it knows about. This hints at other physical systems, such as electrical flow, or heat-transfer, or weather patterns.
However, what I am offering here as a first chunk of code, is purely for fun -- Love and Letter-bots. I wouldn't mind seeing this at giant size on some night-time skyscraper somewhere. Please have a look.
.
Code: Select all
'================================================================================
' Love_And_Letter-bots.bas by Quark 12/2/14
' Using FreeBASIC Compiler - Version 1.00.0 (09-14-2014), for win32 (32bit)
' Use it freely, modify it freely and any responsibility is yours.
'================================================================================
' Purpose: One of a series of graphics demos using common FreeBasic commands.
' This one has letter-bots running around in a mask of an eternal pattern.
'==============================================================================
#lang "fb"
#include "fbgfx.bi"
Using fb
'==============================================================================
Declare Sub Init()
Declare Sub MoveBot(bot As Integer)
Declare Function RndRange(lo As Integer, hi As Integer) As Integer
Declare Function Chance(lo As Integer, hi As Integer) As Integer
Declare Sub Comment(msg As String, clr As Integer)
'==============================================================================
Randomize (Timer)
Windowtitle "Simple FB Graphics Demo Series: MASK - LOVE AND LETTER-BOTS"
'set up screen
Const w= 800, h= 600
Screenres w, h, 8
'define rows and columns
Dim Shared As Integer rows = 75, cols = 100
Width cols,rows
'general string variable
Dim Shared As String tStr
'two characters used for mask
Dim Shared As String * 1 maskbrush = Chr(177), drawbrush = Chr(219)
'for centering mask
Dim Shared As Integer roffset, coffset
'variables for mask array
Dim Shared As Integer maskrows, maskcols, row, col, numbots
'color variables
Dim Shared As Integer drawcolor, maskcolor, mazecolor, commentcolor, splatcolor, duo
'variable for controlling 'bot change of direction"; high num = more 'placid'
Dim Shared As Integer changechance
'4 positions for bot movement
Dim Shared As Integer look(0 To 3, 1 To 2)
Dim Shared As String * 1 compass(0 To 3) = {"N", "E", "S", "W"}
'variables for mask start point
Dim Shared As Integer entryrow, entrycol
'number of bots-into-mask
Dim Shared As Integer printedbots
'user messages
Dim As String msg
Dim As Integer msgctl 'message flag
Dim Shared As Double start
'bot type
Type btype
ch As String * 1
clr As UInteger
currow As Integer
curcol As Integer
curdirection As String * 1
alive As Integer
End Type
'------------------------------------------------------------------------------
'read in the mask, get dimensions for array
Restore mask1
Read tStr
maskrows = 0: maskcols = Len(tStr)
While tStr <> "enddata"
maskrows = maskrows + 1
Read tStr
Wend
Dim Shared As String mask(maskrows, maskcols)
'fill the mask array and find total bot positions
Restore mask1
For row As Integer = 1 To maskrows
Read tStr
For col As Integer = 1 To maskcols
mask(row, col) = Mid(tStr, col, 1)
If mask(row,col) = drawbrush Then numbots += 1
Next
Next
'reduce bot numbers to given percent of available spaces
numbots = numbots * .67 'number of active bots
Dim As Integer rate = 22 'speed
'bots array
Dim Shared As btype b(numbots)
'------------------------------------------------------------------------------
Init() 'set up values and arrays for mask and bot movement
'------------------------------------------------------------------------------
'main loop - move bot around its 'world'
Do
'SCREEN MESSAGE
Select Case msgctl
Case 0
Comment("Letter-bots introduced one-by one into the mask...",14)
Sleep 3500
msgctl = 1
Case 1
Comment("Adding letterbots to fill 80% of space available",14)
msgctl = 2
Case 2
If printedbots = numbots Then
Comment("LAST LETTER-BOT has entered the screen -- letter-bot behavior changes",12)
Sleep 3500
msgctl = 3
End If
Case 3
Comment("Dynamic equilibrium - letter-bots move into blank areas (low-pressure)",14)
start = timer
msgctl = 4
Case 4
If (Timer - start) > 25 Then
Comment("Emergent behavior: letter-bots, ignorant of balance, create a near-balanced system as a whole",14)
msgctl = 5
start = 0
End If
End Select
For i As Integer = 1 To numbots
MoveBot(i) 'move a bot
If (i Mod rate) = 0 Then Sleep 1 'user-change, larger mod num runs faster
Next i ' numbots loop
Loop Until inkey = Chr(27)
'------------------------------------------------------------------------------
End
'==============================================================================
Sub Init()
'for centering mask
roffset = (rows - maskrows + 1) \ 2
coffset = (cols - maskcols + 1) \ 2
'set up colors
drawcolor = 11: maskcolor = 10: mazecolor = 1: splatcolor = 14: commentcolor = 15 : duo = 0
'bot default settings
For i As Integer = 1 To numbots
''F' or 'B'
b(i).ch = "F" :b(i).clr = 4
If Chance(1,2) Then b(i).ch = "B" : b(i).clr = 12
If duo < 2 And Chance(10, numbots) Then
b(i).ch = "*"
b(i).clr = splatcolor
duo = duo + 1
End If
b(i).curdirection = "N"
b(i).alive = 0
Next
'critical num for controlling 'bot change of direction"; high num = more 'placid'
changechance = Int(numbots / 5 + 10) 'try to make bot more calm for crowded conditions
'4 ways bot can "look"
look(0, 1) = -1 : look(0, 2) = 0 'N
look(1, 1) = 0 : look(1, 2) = 1 'E
look(2, 1) = 1 : look(2, 2) = 0 'S
look(3, 1) = 0 : look(3, 2) = -1 'W
'locate single start point in mask
For row As Integer = 1 To maskrows
For col As Integer = 1 To maskcols
If mask(row,col) = drawbrush Then
entryrow = row : entrycol = col
Exit For, For
End If
Next
Next
End Sub
'==============================================================================
Sub MoveBot(bot As Integer)
'PRINT BOTS ONE BY ONE TO ENTRYROW, ENTRYCOL
If printedbots < numbots Then
If Not b(bot).alive Then
For index As Integer = 1 To numbots
If index <> bot Then
If b(index).currow = entryrow And b(index).curcol = entrycol Then
'can't introduce new bot now
Return
End If
End If
Next
mask(entryrow, entrycol) = b(bot).ch
b(bot).alive = -1
b(bot).currow = entryrow
b(bot).curcol = entrycol
Locate roffset + entryrow, coffset + entrycol
Color b(bot).clr
Print b(bot).ch;
printedbots += 1
End If
End If
'Improve bot action while keeping everything under the control of chance.
'BUILD UP LIST OF POSSIBLE MOVES
Dim As String tmpturns, choice
Dim As Integer turnlen, t1, t2
tmpturns = "": choice = ""
For index As Integer = 0 To 3
row = b(bot).currow + look(index, 1)
col = b(bot).curcol + look(index, 2)
If row > 0 And row <= maskrows And col > 0 And col <= maskcols Then
If mask(row, col) = drawbrush Then
tmpturns &= compass(index)
End If
End If
Next
turnlen = Len(tmpturns) 'number of choices
'ACT ACCORDING TO POSSIBLE MOVES; BIAS TO CONTINUE PRESENT COURSE
Select Case turnlen
Case 0
'no move possible
choice = ""
Case 1
'make only available move
choice = tmpturns
Case 2
'handle choice of 2
t1 = Instr(tmpturns, b(bot).curdirection)
If t1 = 0 Then
choice = Mid(tmpturns, RndRange(1, 2), 1) 'even chance
Else
t2 = RndRange(1, changechance)
Select Case t2
Case 1 'chances low change direction
Do
choice = Mid(tmpturns, RndRange(1, 2), 1)
Loop Until choice <> b(bot).curdirection
Case Else 'chances high same direction
choice = Mid(tmpturns, t1, 1)
End Select
End If
Case 3
'handle choice of 3
t1 = Instr(tmpturns, b(bot).curdirection)
If t1 = 0 Then
choice = Mid(tmpturns, RndRange(1, 3), 1) 'equal chance of direction
Else
t2 = RndRange(1, changechance)
Select Case t2
Case 1 'chance low of different direction
Do
choice = Mid(tmpturns, RndRange(1, 3), 1)
Loop Until choice <> b(bot).curdirection
Case Else ' chance high for same direction
choice = Mid(tmpturns, t1, 1)
End Select
End If
Case 4
'handle choice of 4
t1 = Instr(tmpturns, b(bot).curdirection)
t2 = RndRange(1, changechance)
Select Case t2
Case 1
Do
choice = Mid(tmpturns, RndRange(1, 4), 1)
Loop Until choice <> b(bot).curdirection
Case Else
choice = Mid(tmpturns, t1, 1)
End Select
End Select
Select Case choice
Case ""
Case "N"
row = b(bot).currow + look(0, 1): col = b(bot).curcol + look(0, 2)
Case "E"
row = b(bot).currow + look(1, 1): col = b(bot).curcol + look(1, 2)
Case "S"
row = b(bot).currow + look(2, 1): col = b(bot).curcol + look(2, 2)
Case "W"
row = b(bot).currow + look(3, 1): col = b(bot).curcol + look(3, 2)
End Select
'UPDATE MASK ARRAY AND PRINT BOT
If choice <> "" Then
mask(row, col) = b(bot).ch
mask(b(bot).currow, b(bot).curcol) = drawbrush
Locate roffset + row, coffset + col
Color b(bot).clr
Print b(bot).ch; 'new position
Locate roffset + b(bot).currow, coffset + b(bot).curcol
Print " "; 'delete old position
b(bot).currow = row
b(bot).curcol = col
b(bot).curdirection = choice
End If
End Sub
'==============================================================================
Function RndRange(lo As Integer, hi As Integer) As Integer
Dim r As Integer
r = hi - lo + 1
Return Int(Rnd(1) * (hi - lo + 1) + lo)
End Function
'================================================================================
Function Chance(lo As Integer, hi As Integer) As Integer
'returns 1 if chance is successful, 0 otherwise
If lo >= hi Then Chance% = -1
Return Int(Rnd * hi) < lo
End Function
'==============================================================================
Sub Comment(msg As String, clr As Integer)
Locate rows,1 : Print Space(cols-2);
Locate rows,(cols-Len(msg))\2 : Color clr : Print msg;
End Sub
'==============================================================================
mask1:
Data "±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±±±±±±±ÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛÛÛÛÛ±±±±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±ÛÛÛÛÛ±±±±±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±"
Data "±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±"
Data "±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±"
Data "±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±"
Data "±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±"
Data "±±±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±"
Data "±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±"
Data "±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±"
Data "±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±"
Data "±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±"
Data "±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±±±±Û±±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±"
Data "±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±ÛÛÛÛÛ±±±Û±±±±±±Û±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±ÛÛÛ±Û±±±±±±Û±±±ÛÛÛ±ÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±ÛÛÛ±±±±±±Û±±±±±ÛÛÛ±±±±±±ÛÛÛ±±±±±ÛÛÛÛ±±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±ÛÛ±±±±±±Û±±±±±±±±±±±±±±±±Û±±±ÛÛÛ±±ÛÛ±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±Û±±±Û±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±ÛÛ±±±±±Û±±±±±±±Û±±±±±Û±±±±±±±±±±Û±±ÛÛ±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±ÛÛ±±±ÛÛ±±±±±±±Û±±±±ÛÛ±±±±±±±±±±Û±±Û±±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±ÛÛÛÛÛÛ±±±±±±±ÛÛÛÛÛÛ±±±±±±±±±±±Û±±Û±±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±Û±±Û±±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±±±Û±±±±±±±±±±±±±Û±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±ÛÛ±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±±±±±±±Û±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±Û±±ÛÛ±±ÛÛ±±±±±±±±ÛÛ±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±ÛÛ±±±±±±±Û±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±Û±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±Û±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±ÛÛ±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±Û±±±±±±±±Û±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±Û±±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±ÛÛÛ±±ÛÛ±±±±±±±±ÛÛ±ÛÛ±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±Û±±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±Û±±ÛÛ±ÛÛÛÛ±±±±±±±±±±ÛÛÛ±±ÛÛ±±±Û±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±Û±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±"
Data "±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±±Û±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±"
Data "±±±±Û±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±ÛÛ±ÛÛ±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±"
Data "±±±±Û±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±ÛÛ±±±ÛÛ±±±±±±±±±±±±±±±±±±ÛÛÛ±ÛÛ±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±Û±±±±±"
Data "±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±Û±±±±±ÛÛ±±±±±ÛÛ±±±±±±±±±±±±±±±±ÛÛ±±±±ÛÛ±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±ÛÛÛ±±±"
Data "±±±Û±±±±±±±±±±±±±±±±±±±±±±Û±±±±ÛÛ±±±±±±±ÛÛ±±±±±±±±±±±±±ÛÛÛ±±±±±±ÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±Û±±±"
Data "±±ÛÛ±±±±±±±±±±±±±±±±±±±±±ÛÛ±ÛÛÛÛ±±±±±±±±±Û±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±"
Data "±ÛÛ±±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±"
Data "±Û±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±Û±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±±±±±Û±±±±±±±±±±±±±±±±±±±Û±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±±±±±±±Û±±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±ÛÛÛ±±±±±±±±±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±Û±±±ÛÛ±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±Û±"
Data "±ÛÛÛÛÛ±±±±±±±±ÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±Û±Û±ÛÛÛÛ±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±ÛÛÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±±±±±±ÛÛÛÛÛÛ±Û±±ÛÛ±±±±ÛÛÛÛ±±±±±±±±±±ÛÛ±±±±ÛÛ±Û±Û±ÛÛÛ±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ÛÛ±±±±±±Û±±Û±±±±±±±±ÛÛ±±±±±±±ÛÛÛÛÛÛ±±ÛÛ±Û±Û±ÛÛÛÛÛ±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±ÛÛÛÛÛÛ±±±±±±±±±±±±±ÛÛ±±±±±±±ÛÛÛÛ±±±±±±±±±Û±±±±±ÛÛÛÛ±Û±Û±ÛÛÛ±Û±Û±Û±Û±Û±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±ÛÛÛÛÛ±Û±Û±±ÛÛÛÛÛ±±±±±±Û±±±±±±±±±ÛÛ±±±±±±±±±±ÛÛ±±±ÛÛÛ±Û±Û±ÛÛÛ±Û±Û±Û±Û±Û±ÛÛ±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±ÛÛÛ±Û±Û±Û±ÛÛÛÛÛ±ÛÛÛ±±±±±Û±±±±±±±±±ÛÛ±±±±±±±±±±±Û±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±ÛÛÛ±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±ÛÛÛ±±±Û±±±±±±±±±ÛÛ±±±±±±±±±±ÛÛ±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±ÛÛÛ±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±Û±±±±±±±±±±±±±±±±±±±±±Û±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±Û±±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±ÛÛ±Û±±±±±±±±±±±±±±±±±±Û±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±Û±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±ÛÛ±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±Û±±±±±±±±±±±±±±±±±Û±ÛÛÛ±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±Û±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±Û±Û±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±ÛÛÛ±Û±±±±±±±±±±±±±±±±±Û±Û±±±Û±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±Û±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±Û±Û±Û±Û±Û±Û±Û±Û±Û±±±Û±±Û±Û±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±Û±ÛÛ±±ÛÛ±±Û±Û±Û±Û±Û±Û±Û±Û±Û±±ÛÛ±±±±±±±±±±±Û±"
Data "±Û±±±±±±±Û±±±Û±Û±Û±Û±Û±Û±Û±Û±±ÛÛ±ÛÛ±Û±±±±±±±±±±±±±±±±Û±±Û±±Û±±±ÛÛ±±±Û±Û±Û±Û±Û±Û±Û±±±ÛÛ±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±ÛÛÛ±Û±Û±Û±Û±Û±Û±Û±±±ÛÛ±±Û±±Û±±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±ÛÛ±±ÛÛ±±±ÛÛ±±Û±Û±Û±Û±Û±Û±Û±ÛÛÛ±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±Û±±±Û±Û±Û±Û±Û±±±ÛÛÛ±±ÛÛ±±±Û±Û±±±±±±±±±±±±±±±Û±±±±Û±±±±ÛÛ±±±Û±Û±Û±Û±Û±±±ÛÛ±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±ÛÛÛ±±±Û±Û±Û±±±±ÛÛ±±±±Û±±±±Û±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±Û±±±±ÛÛ±±±±ÛÛÛ±±±Û±Û±Û±Û±±ÛÛÛ±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±ÛÛ±±±±±±±±±ÛÛÛ±±±±ÛÛ±±±±Û±±±±±±±±±±±±±±Û±±Û±±±±±Û±±±±±±ÛÛ±±±±±±±±±±ÛÛÛ±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±ÛÛÛÛÛÛÛÛÛÛ±±±±±±±Û±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±ÛÛ±±±±±ÛÛ±±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛ±±±±±±±±±±±±±±±±±Û±"
Data "±Û±±±±±±±±±±±±±±±±±Û±±±±±±±±±±ÛÛ±±±±±±Û±±±±±±±±±±±±±±±Û±±±±±±±ÛÛ±±±±±±±±±±Û±±±±±±±±±±±±±±±±±±±±±±±Û±"
Data "±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±±±±±±±±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ±"
Data "±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±"
Data "enddata"