Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Mini
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@activitycentral.org>2011-06-28 09:23:54 (GMT)
committer Aleksey Lim <alsroot@activitycentral.org>2011-06-28 09:24:48 (GMT)
commit11003147ac4ea947ec5017921019d668cb4953d1 (patch)
treeeaab12347c33cb62326f9eb53121eff594301638 /Mini
parent35278d261ace09d5ed20bdae0983730d88dd8037 (diff)
Switch to the singular sources tree and releasing scheme
Diffstat (limited to 'Mini')
-rw-r--r--Mini/Fillin.py105
-rw-r--r--Mini/GenRythm.py82
-rw-r--r--Mini/InstrumentPanel.py392
-rw-r--r--Mini/KeyboardStandAlone.py144
-rw-r--r--Mini/Loop.py227
-rw-r--r--Mini/MiniSequencer.py139
-rw-r--r--Mini/RythmGenerator.py79
-rw-r--r--Mini/__init__.py0
-rw-r--r--Mini/lps.py242
-rw-r--r--Mini/miniTamTamMain.py800
-rw-r--r--Mini/miniToolbars.py384
11 files changed, 2594 insertions, 0 deletions
diff --git a/Mini/Fillin.py b/Mini/Fillin.py
new file mode 100644
index 0000000..162f8ef
--- /dev/null
+++ b/Mini/Fillin.py
@@ -0,0 +1,105 @@
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+import gobject
+
+from RythmGenerator import *
+from common.Util.CSoundClient import new_csound_client
+from common.Util.NoteDB import Note
+import common.Config as Config
+
+class Fillin:
+ def __init__( self, nbeats, tempo, instrument, reverb, volume ):
+ self.notesList = []
+ self.barCount = 0
+ self.gate = 0
+ self.nbeats = nbeats
+ self.tempo = tempo
+ self.instrument = instrument
+ self.reverb = reverb
+ self.volume = volume
+ self.onsets = []
+ self.pitchs = []
+ self.playBackTimeout = None
+ self.csnd = new_csound_client()
+
+ def reset( self ):
+ self.barCount = 0
+ self.gate = 0
+
+ def setInstrument( self, instrument ):
+ self.instrument = instrument
+
+ def setBeats( self, nbeats ):
+ if self.playBackTimeout != None:
+ gobject.source_remove( self.playBackTimeout )
+
+ self.nbeats = nbeats
+ self.clear()
+ self.reset()
+
+ def setTempo( self, tempo ):
+ self.tempo = tempo
+ if self.playBackTimeout != None:
+ gobject.source_remove( self.playBackTimeout )
+ self.play()
+
+ def setReverb( self, reverb ):
+ self.reverb = reverb
+
+ def setVolume( self, volume ):
+ self.volume = volume
+
+ def play( self ):
+ if self.playBackTimeout == None:
+ self.playbackTimeout = gobject.timeout_add( int(60000/self.tempo/8), self.handleClock )
+ self.handleClock()
+
+ def stop( self ):
+ if self.playBackTimeout != None:
+ gobject.source_remove( self.playBackTimeout )
+ self.clear()
+
+ def clear( self ):
+ if self.notesList:
+ for n in self.notesList:
+ self.csnd.loopDelete(n)
+ self.notesList = []
+
+ def handleClock( self ):
+ tick = self.csnd.loopGetTick()
+ if tick < ( Config.TICKS_PER_BEAT / 2 + 1 ):
+ if self.gate == 0:
+ self.gate = 1
+ self.barCount += 1
+ self.barCount %= 4
+ if self.barCount == 1:
+ self.clear()
+
+ if tick > ( ( Config.TICKS_PER_BEAT * self.nbeats ) - ( Config.TICKS_PER_BEAT / 2 ) - 1 ):
+ if self.gate == 1:
+ self.gate = 0
+ if self.barCount == 3:
+ self.regenerate()
+ return True
+
+ def unavailable( self, onsets, pitchs ):
+ self.onsets = onsets
+ self.pitchs = pitchs
+
+ def regenerate(self):
+ def flatten(ll):
+ rval = []
+ for l in ll:
+ rval += l
+ return rval
+ i = 500
+ self.notesList= []
+ for x in flatten( generator(self.instrument, self.nbeats, 0.4, 0.1, self.reverb) ):
+ if x.onset not in self.onsets or x.pitch not in self.pitchs:
+ x.amplitude = x.amplitude*self.volume
+ n = Note(0, x.trackId, i, x)
+ self.notesList.append(n)
+ i += 1
+ self.csnd.loopPlay(n,1) #add as active
+
diff --git a/Mini/GenRythm.py b/Mini/GenRythm.py
new file mode 100644
index 0000000..7d67994
--- /dev/null
+++ b/Mini/GenRythm.py
@@ -0,0 +1,82 @@
+import random
+import common.Config as Config
+
+from common.Generation.GenerationConstants import GenerationConstants
+from common.Generation.Utils import *
+from common.Util import InstrumentDB
+
+class GenRythm:
+ def drumRythmSequence(self, instrumentName, nbeats, density, regularity ):
+ instrumentDB = InstrumentDB.getRef()
+ rythmSequence = []
+ binSelection = []
+ downBeats = []
+ upBeats = []
+ beats = []
+ countDown = 0
+ onsetTime = None
+
+ if instrumentDB.instNamed[instrumentName].instrumentRegister == Config.PUNCH:
+ registerDensity = 0.5
+ downBeatRecurence = 4
+ downBeats = [x for x in GenerationConstants.DRUM_PUNCH_ACCENTS[ nbeats ]]
+ for downBeat in downBeats:
+ upBeats.append( downBeat + Config.TICKS_PER_BEAT / 2 )
+
+ if instrumentDB.instNamed[instrumentName].instrumentRegister == Config.LOW:
+ registerDensity =1
+ downBeatRecurence = 4
+ downBeats = [x for x in GenerationConstants.DRUM_LOW_ACCENTS[ nbeats ]]
+ for downBeat in downBeats:
+ upBeats.append( downBeat + Config.TICKS_PER_BEAT / 2 )
+
+ if instrumentDB.instNamed[instrumentName].instrumentRegister == Config.MID:
+ registerDensity = .75
+ downBeatRecurence = 1
+ downBeats = [x for x in GenerationConstants.DRUM_MID_ACCENTS[ nbeats ]]
+ for downBeat in downBeats:
+ upBeats.append( downBeat + Config.TICKS_PER_BEAT / 4 )
+
+ if instrumentDB.instNamed[instrumentName].instrumentRegister == Config.HIGH:
+ registerDensity = 1.5
+ downBeatRecurence = 1
+ downBeats = [x for x in GenerationConstants.DRUM_HIGH_ACCENTS[ nbeats ]]
+ for downBeat in downBeats:
+ upBeats.append( downBeat + Config.TICKS_PER_BEAT / 4 )
+
+ realDensity = density * registerDensity
+ if realDensity > 1.:
+ realDensity = 1.
+
+ list = range( int( realDensity * len( downBeats ) ) )
+ for i in list:
+ if random.random() < ( regularity * downBeatRecurence ) and binSelection.count( 1 ) < len( downBeats ):
+ binSelection.append( 1 )
+ else:
+ if binSelection.count( 0 ) < len( downBeats ):
+ binSelection.append( 0 )
+ else:
+ binSelection.append( 1 )
+
+ countDown = binSelection.count( 1 )
+
+ length = len(downBeats) - 1
+ for i in range( countDown ):
+ ran1 = random.randint(0, length)
+ ran2 = random.randint(0, length)
+ randMin = min(ran1, ran2)
+ onsetTime = downBeats.pop(randMin)
+ rythmSequence.append( onsetTime )
+ length -= 1
+
+ length = len(upBeats) - 1
+ for i in range( len( binSelection ) - countDown ):
+ ran1 = random.randint(0, length)
+ ran2 = random.randint(0, length)
+ randMin = min(ran1, ran2)
+ onsetTime = upBeats.pop(randMin)
+ rythmSequence.append( onsetTime )
+ length -= 1
+
+ rythmSequence.sort()
+ return rythmSequence
diff --git a/Mini/InstrumentPanel.py b/Mini/InstrumentPanel.py
new file mode 100644
index 0000000..b6c1229
--- /dev/null
+++ b/Mini/InstrumentPanel.py
@@ -0,0 +1,392 @@
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+
+import time
+
+import common.Config as Config
+from common.Util.ThemeWidgets import *
+from common.Util import InstrumentDB
+from common.port.scrolledbox import HScrolledBox
+import sugar.graphics.style as style
+import logging
+
+InstrumentSize = 116
+Tooltips = Config.Tooltips
+
+class InstrumentPanel( gtk.EventBox ):
+ def __init__(self,setInstrument=None):
+ gtk.EventBox.__init__(self)
+
+ self.instrumentDB = InstrumentDB.getRef()
+ self.setInstrument = setInstrument
+ self.playInstrument = None
+ self.micRec = None
+ self.synthRec = None
+ self.rowLen = None
+ self.enterMode = False
+
+ self.instDic = None
+
+ self.loaded = False
+ self.loadData = {}
+ self.loadStage = [0,0,0]
+
+ def configure( self, setInstrument = None, playInstrument = None, enterMode = False, micRec = None, synthRec = None, rowLen = 8, width = -1 ):
+
+ self.setInstrument = setInstrument
+ self.playInstrument = playInstrument
+ self.enterMode = enterMode
+ self.micRec = micRec
+
+ if width != -1:
+ rowLen = width / InstrumentSize
+ if self.rowLen == rowLen:
+ return
+
+ self.rowLen = rowLen
+
+ if self.loaded:
+ self.prepareInstrumentTable(self.category)
+
+ def load( self, timeout = -1 ):
+ if self.loaded: return True
+ if Config.DEBUG > 4: print "InstrumentPanel load", self.loadStage
+
+ if self.loadStage[0] == 0:
+ color = gtk.gdk.color_parse(Config.PANEL_BCK_COLOR)
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.loadStage[0] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 1:
+ self.tooltips = gtk.Tooltips()
+ self.loadStage[0] = 2
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 2:
+ self.instTable = None
+ self.recstate = False
+ self.lastInstrumentWidget = None
+
+ self.mainVBox = gtk.VBox()
+ self.loadStage[0] = 3
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 3:
+ if not self.loadInstrumentList( timeout, self.loadStage ):
+ return False
+ self.loadStage[0] = 4
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 4:
+ if not self.loadToolbar( timeout, self.loadStage ):
+ return False
+ self.loadStage[0] = 5
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 5:
+ if self.instDic == None:
+ self.instDic = {}
+ self.loadStage[0] = 5.1
+ else:
+ self.loadStage[0] = 6
+
+ if self.loadStage[0] == 5.1:
+ if not self.loadInstDic( self.instDic, timeout, self.loadStage ):
+ return False
+ self.loadStage[0] = 6
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 6:
+ self.loadInstrumentViewport()
+ self.loadStage[0] = 7
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.loadStage[0] == 7:
+ self.prepareInstrumentTable()
+ self.loadStage[0] = 8
+ if timeout >= 0 and time.time() > timeout: return False
+
+ self.add(self.mainVBox)
+ self.show_all()
+
+ self.loaded = True
+ return True
+
+ def loadInstrumentList( self, timeout = -1, loadStage = [0,0,0] ):
+
+ if loadStage[1] == 0:
+ self.instrumentList = { "all": [], "all.enterMode": [], "percussions.enterMode": [], "mysounds": [] }
+ for category in Config.CATEGORIES:
+ self.instrumentList[category] = []
+ loadStage[1] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if loadStage[1] == 1:
+ keys = self.instrumentDB.instNamed.keys()
+ for i in range(loadStage[2], len(keys)):
+ key = keys[i]
+
+ instrument = self.instrumentDB.instNamed[key]
+ if not instrument.kitStage and not instrument.kit:
+ if not key.startswith('mic') and not key.startswith('lab'):
+ self.instrumentList["all"].append( key )
+ self.instrumentList["all.enterMode"].append( key )
+ self.instrumentList[instrument.category].append( key )
+ if instrument.category == "percussions":
+ self.instrumentList["percussions.enterMode"].append( key )
+ loadStage[2] += 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ loadStage[1] = 2
+ loadStage[2] = 0
+
+ self.instrumentList["mysounds"].sort()
+
+ self.instrumentList["all"] += self.instrumentList["mysounds"]
+ self.instrumentList["all.enterMode"] += self.instrumentList["mysounds"]
+
+ loadStage[1] = 0
+ return True
+
+ def loadToolbar( self, timeout = -1, loadStage = [0,0,0] ):
+ if loadStage[1] == 0:
+ self.toolbarBox = gtk.HBox()
+
+ scrollbox = HScrolledBox(scroll_policy=gtk.POLICY_NEVER)
+ scrollbox.set_viewport(self.toolbarBox)
+ scrollbox.modify_bg(gtk.STATE_NORMAL, style.Color(Config.PANEL_BCK_COLOR).get_gdk_color())
+ self.mainVBox.pack_end(scrollbox, False, False)
+
+ self.firstTbBtn = None
+ self.loadStage[1] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ for i in range(loadStage[1]-1, len(Config.CATEGORIES)):
+ category = Config.CATEGORIES[i]
+ if loadStage[2] == 0:
+ self.loadData["btnBox"] = RoundVBox(fillcolor = Config.CATEGORY_BCK_COLOR, bordercolor = Config.PANEL_BCK_COLOR, radius = Config.PANEL_RADIUS)
+ self.loadData["btnBox"].set_border_width(Config.PANEL_SPACING)
+ loadStage[2] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if loadStage[2] == 1:
+ self.loadData["btn"] = ImageRadioButton(self.firstTbBtn,Config.IMAGE_ROOT + category + '.png', Config.IMAGE_ROOT + category + 'sel.png', Config.IMAGE_ROOT + category + 'sel.png')
+ loadStage[2] = 2
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if self.firstTbBtn == None:
+ self.firstTbBtn = self.loadData["btn"]
+ self.loadData["btn"].connect('clicked',self.handleToolbarBtnPress,category)
+ self.tooltips.set_tip(self.loadData["btn"],str(category))
+ self.loadData["btnBox"].add(self.loadData["btn"])
+ self.toolbarBox.pack_start(self.loadData["btnBox"],True,True)
+
+ loadStage[2] = 0
+ loadStage[1] += 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ self.loadData.pop("btn")
+ self.loadData.pop("btnBox")
+ loadStage[1] = 0
+ return True
+
+ def loadInstDic( self, instDic, timeout = -1, loadStage = [0,0,0] ):
+
+ if loadStage[1] == 0:
+ self.firstInstButton = None
+ self.loadData["len"] = len(self.instrumentList['all'])
+ loadStage[1] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+
+ for i in range( loadStage[1]-1, self.loadData["len"] ):
+ instrument = self.instrumentList["all"][i]
+ if loadStage[2] == 0:
+ self.loadData["instBox"] = RoundVBox(fillcolor = Config.INST_BCK_COLOR, bordercolor = Config.INSTRUMENT_GRID_COLOR, radius = Config.PANEL_RADIUS)
+ self.loadData["instBox"].set_border_width(Config.PANEL_SPACING)
+ loadStage[2] = 1
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if loadStage[2] == 1:
+ try:
+ self.loadData["instButton"] = ImageRadioButton(self.firstInstButton, Config.IMAGE_ROOT + instrument + '.png' , Config.IMAGE_ROOT + instrument + 'sel.png', Config.IMAGE_ROOT + instrument + 'sel.png')
+ except:
+ self.loadData["instButton"] = ImageRadioButton(self.firstInstButton, Config.IMAGE_ROOT + 'generic.png' , Config.IMAGE_ROOT + 'genericsel.png', Config.IMAGE_ROOT + 'genericsel.png')
+ loadStage[2] = 2
+ if timeout >= 0 and time.time() > timeout: return False
+
+ if loadStage[2] == 2:
+ self.loadData["instButton"].clickedHandler = self.loadData["instButton"].connect('clicked',self.handleInstrumentButtonClick, instrument)
+ self.loadData["instButton"].connect('enter',self.handleInstrumentButtonEnter, instrument)
+ loadStage[2] = 3
+ if timeout >= 0 and time.time() > timeout: return False
+
+ self.tooltips.set_tip(self.loadData["instBox"],str(self.instrumentDB.instNamed[instrument].nameTooltip))
+
+ self.loadData["instBox"].pack_start(self.loadData["instButton"],False,False)
+ instDic[instrument] = self.loadData["instBox"]
+ if self.firstInstButton == None:
+ self.firstInstButton = self.loadData["instButton"]
+ loadStage[2] = 0
+ if timeout >= 0 and time.time() > timeout: return False
+
+ loadStage[1] += 1
+
+ self.loadData.pop("instBox")
+ self.loadData.pop("instButton")
+ self.loadData.pop("len")
+ loadStage[1] = 0
+ return True
+
+ def loadInstrumentViewport( self ):
+ self.instrumentBox = RoundHBox(fillcolor = Config.INSTRUMENT_GRID_COLOR, bordercolor = Config.PANEL_BCK_COLOR, radius = Config.PANEL_RADIUS)
+
+ self.tableEventBox = gtk.EventBox()
+ color = gtk.gdk.color_parse(Config.INSTRUMENT_GRID_COLOR)
+ self.tableEventBox.modify_bg(gtk.STATE_NORMAL, color)
+
+ scrollwin = gtk.ScrolledWindow()
+ scrollwin.set_policy(gtk.POLICY_NEVER,gtk.POLICY_AUTOMATIC)
+ scrollwin.add_with_viewport(self.tableEventBox)
+ alignment = gtk.Alignment(1, 0, 0, 1)
+ alignment.add(scrollwin)
+
+ self.tableEventBox.get_parent().set_shadow_type( gtk.SHADOW_NONE )
+ self.instrumentBox.pack_start(alignment, True, True, 0)
+ self.mainVBox.pack_start(self.instrumentBox)
+ self.show_all()
+
+ def prepareInstrumentTable(self,category = 'all'):
+
+ self.category = category
+
+ if self.enterMode:
+ if category == "all": category = "all.enterMode"
+ elif category == "percussions": category = "percussions.enterMode"
+
+ if self.instTable != None:
+ for child in self.instTable.get_children()[:]:
+ self.instTable.remove(child)
+ self.tableEventBox.remove(self.instTable)
+ self.instTable.destroy()
+
+ instrumentNum = len(self.instrumentList[category])
+ instruments = self.instrumentList[category]
+
+ cols = self.rowLen
+ if instrumentNum < cols:
+ cols = instrumentNum
+ rows = (instrumentNum // cols)
+ if instrumentNum % cols is not 0: #S'il y a un reste
+ rows = rows + 1
+
+ self.instTable = gtk.Table(rows,cols,True)
+ self.instTable.set_row_spacings(0)
+ self.instTable.set_col_spacings(0)
+
+ for row in range(rows):
+ for col in range(cols):
+ i = row*cols+col
+ if i >= instrumentNum:
+ break
+ inst = instruments[i]
+ if self.instDic.has_key(inst):
+ self.instTable.attach(self.instDic[inst], col, col+1, row, row+1, gtk.SHRINK, gtk.SHRINK, 0, 0)
+
+ self.tableEventBox.add(self.instTable)
+ self.instTable.show_all()
+
+ def selectFirstCat(self):
+ self.firstTbBtn.set_active(True)
+
+ def handleToolbarBtnPress(self, widget, category):
+ if widget.get_active():
+ self.prepareInstrumentTable(category)
+
+ def handleInstrumentButtonClick(self,widget,instrument):
+ if widget.get_active() is True and self.recstate == False:
+ if self.setInstrument:
+ widget.event( gtk.gdk.Event( gtk.gdk.LEAVE_NOTIFY ) ) # fake the leave event
+ self.setInstrument(instrument)
+ time.sleep(0.05)
+ if self.playInstrument: self.playInstrument(instrument)
+ if self.enterMode:
+ pass #Close the window
+
+ def handleInstrumentButtonEnter(self,widget,instrument):
+ if self.enterMode and self.playInstrument:
+ self.playInstrument(instrument)
+
+ def handleMicRecButtonClick(self,widget,mic):
+ self.recstate = False
+ self.setInstrument(mic)
+ if self.micRec: self.micRec(mic)
+
+ def handleRecButtonPress(self,widget,btn):
+ self.recstate = True
+ btn.set_active(True)
+
+ def set_activeInstrument(self,instrument, state):
+ if len(self.instDic) > 0:
+ for key in self.instDic:
+ if key == instrument:
+ btn = self.instDic[key].get_children()[0]
+ btn.handler_block(btn.clickedHandler)
+ btn.set_active(state)
+ btn.handler_unblock(btn.clickedHandler)
+
+
+class DrumPanel( gtk.EventBox ):
+ def __init__(self, setDrum = None):
+ gtk.EventBox.__init__(self)
+ color = gtk.gdk.color_parse(Config.PANEL_BCK_COLOR)
+ self.modify_bg(gtk.STATE_NORMAL, color)
+
+ self.setDrum = setDrum
+ self.instrumentList = []
+ keys = self.instrumentDB.instNamed.keys()
+ for key in keys:
+ if self.instrumentDB.instNamed[key].category == "kit":
+ self.instrumentList.append( key )
+ self.instrumentList.sort()
+ self.drawDrums()
+
+ def drawDrums(self):
+ firstBtn = None
+ btnBox = RoundHBox(fillcolor = '#6F947B', bordercolor = Config.PANEL_BCK_COLOR, radius = Config.PANEL_RADIUS)
+ btnBox.set_border_width(Config.PANEL_SPACING)
+ self.drums = {}
+ for drumkit in self.instrumentList:
+ instBox = RoundVBox(fillcolor = Config.INST_BCK_COLOR, bordercolor = Config.PANEL_COLOR, radius = Config.PANEL_RADIUS)
+ instBox.set_border_width(Config.PANEL_SPACING)
+ self.drums[drumkit] = ImageRadioButton(firstBtn, Config.IMAGE_ROOT + drumkit + '.png' , Config.IMAGE_ROOT + drumkit + 'sel.png', Config.IMAGE_ROOT + drumkit + 'sel.png')
+ self.drums[drumkit].clickedHandler = self.drums[drumkit].connect('clicked',self.setDrums,drumkit)
+ if firstBtn == None:
+ firstBtn = self.drums[drumkit]
+ instBox.pack_start(self.drums[drumkit], False, False, 0)
+ btnBox.pack_start(instBox, False, False, 0)
+ self.add(btnBox)
+ self.show_all()
+
+ def setDrums(self,widget,data):
+ if widget.get_active():
+ if self.setDrum:
+ widget.event( gtk.gdk.Event( gtk.gdk.LEAVE_NOTIFY ) ) # fake the leave event
+ self.setDrum(data)
+
+ def set_activeInstrument( self, instrument, state ):
+ if instrument in self.instrumentList:
+ btn = self.drums[instrument]
+ btn.handler_block(btn.clickedHandler)
+ btn.set_active(state)
+ btn.handler_unblock(btn.clickedHandler)
+
+if __name__ == "__main__":
+ win = gtk.Window()
+ wc = DrumPanel(None)
+ win.add(wc)
+ win.show()
+ #start the gtk event loop
+ gtk.main()
diff --git a/Mini/KeyboardStandAlone.py b/Mini/KeyboardStandAlone.py
new file mode 100644
index 0000000..cc86a31
--- /dev/null
+++ b/Mini/KeyboardStandAlone.py
@@ -0,0 +1,144 @@
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+
+import common.Config as Config
+from common.Generation.GenerationConstants import GenerationConstants
+from common.Util.NoteDB import Note
+from common.Util.CSoundNote import CSoundNote
+from common.Util.CSoundClient import new_csound_client
+from common.Util import InstrumentDB
+
+KEY_MAP_PIANO = Config.KEY_MAP_PIANO
+
+#log = file('/home/olpc/log.tamtam','w')
+
+class KeyboardStandAlone:
+ def __init__( self, recordingFunction, adjustDurationFunction, getCurrentTick, getPlayState, loop ):
+ self.instrumentDB = InstrumentDB.getRef()
+ self.csnd = new_csound_client()
+ self.recording = recordingFunction
+ self.adjustDuration = adjustDurationFunction
+ self.getPlayState = getPlayState
+ self.key_dict = dict()
+ self.onset_dict = dict()
+ self.trackCount = 0
+ self.instrument = 'flute'
+ self.reverb = 0
+ self.loop = loop
+ self.loopSustain = False
+ self.sustainedLoop = []
+
+ def setInstrument( self , instrument ):
+ self.instrument = instrument
+
+ def setReverb(self , reverb):
+ self.reverb = reverb
+
+ def onKeyPress(self,widget,event, volume):
+ key = event.hardware_keycode
+ if key == 50 or key == 62: #Left Shift
+ self.loopSustain = True
+
+ # If the key is already in the dictionnary, exit function (to avoir key repeats)
+ if self.key_dict.has_key(key):
+ return
+
+ if key in Config.LOOP_KEYS:
+ if key in self.sustainedLoop:
+ self.loop.stop(key)
+ self.sustainedLoop.remove(key)
+ elif self.loopSustain:
+ self.loop.start(key, self.instrument, self.reverb)
+ self.sustainedLoop.append(key)
+ else:
+ self.loop.start(key, self.instrument, self.reverb)
+ return
+
+ # Assign on which track the note will be created according to the number of keys pressed
+ if self.trackCount >= 9:
+ self.trackCount = 1
+ track = self.trackCount
+ self.trackCount += 1
+ # If the pressed key is in the keymap
+ if KEY_MAP_PIANO.has_key(key):
+ def playkey(pitch,duration,instrument):
+ # Create and play the note
+ self.key_dict[key] = CSoundNote(onset = 0,
+ pitch = pitch,
+ amplitude = volume,
+ pan = 0.5,
+ duration = duration,
+ trackId = track,
+ instrumentId = instrument.instrumentId,
+ reverbSend = self.reverb,
+ tied = True,
+ mode = 'mini')
+ self.csnd.play(self.key_dict[key], 0.3)
+ if self.getPlayState():
+ recOnset = int(self.csnd.loopGetTick())
+ self.onset_dict[key] = recOnset
+ self.recording( CSoundNote(
+ onset = recOnset,
+ pitch = pitch,
+ amplitude = volume,
+ pan = 0.5,
+ duration = 100,
+ trackId = 0,
+ decay = .1,
+ instrumentId = instrument.instrumentId,
+ reverbSend = self.reverb,
+ tied = False,
+ mode = 'mini'))
+
+ instrumentName = self.instrument
+ #print >>log, 'instrumentName:', instrumentName
+ pitch = KEY_MAP_PIANO[key]
+
+ if self.instrumentDB.instNamed[instrumentName].kit != None:
+ if pitch in GenerationConstants.DRUMPITCH:
+ pitch = GenerationConstants.DRUMPITCH[pitch]
+ #print >>log, 'kit_element: ', Config.KIT_ELEMENT[pitch]
+ playkey(36,100, self.instrumentDB.instNamed[instrumentName].kit[pitch])
+
+ else:
+ if event.state == gtk.gdk.MOD1_MASK:
+ pitch += 5
+
+ instrument = self.instrumentDB.instNamed[ instrumentName ]
+ if instrument.csoundInstrumentId == Config.INST_PERC: #Percussions resonance
+ playkey( pitch, 60, instrument)
+ else:
+ playkey( pitch, -1, instrument)
+
+
+ def onKeyRelease(self,widget,event):
+ key = event.hardware_keycode
+ if key == 50 or key == 62:
+ self.loopSustain = False
+
+ if key in Config.LOOP_KEYS:
+ if key in self.sustainedLoop:
+ return
+ else:
+ self.loop.stop(key)
+ return
+
+ if KEY_MAP_PIANO.has_key(key):
+ csnote = self.key_dict[key]
+ if self.instrumentDB.instId[ csnote.instrumentId ].csoundInstrumentId == Config.INST_TIED:
+ csnote.duration = .5
+ csnote.decay = 0.7
+ #csnote.amplitude = 1
+ csnote.tied = False
+ csnote.mode = 'mini'
+ self.csnd.play(csnote, 0.3)
+ if self.getPlayState():
+ self.adjustDuration(csnote.pitch, self.onset_dict[key])
+ del self.key_dict[key]
+ if self.getPlayState():
+ if self.onset_dict.has_key(key):
+ del self.onset_dict[key]
+
+ def onButtonPress( self, widget, event ):
+ pass
diff --git a/Mini/Loop.py b/Mini/Loop.py
new file mode 100644
index 0000000..348b465
--- /dev/null
+++ b/Mini/Loop.py
@@ -0,0 +1,227 @@
+import common.Config as Config
+import random
+import lps
+from common.Generation.Drunk import *
+from common.Util.CSoundNote import CSoundNote
+from common.Util.CSoundClient import new_csound_client
+from common.Util.NoteDB import Note
+from common.Util.NoteDB import PARAMETER
+from common.Generation.GenerationConstants import GenerationConstants
+from common.Util import InstrumentDB
+
+class Loop:
+ def __init__( self, beat, volume ):
+ self.instrumentDB = InstrumentDB.getRef()
+ self.notesDict = {}
+ self.notesList = []
+ self.beat = beat
+ self.volume = volume
+ self.id = 4000
+ self.csnd = new_csound_client()
+
+ def stop( self, key ):
+ if (Config.DEBUG > 3): print 'stop loop at key: ' + str(key)
+ for n in self.notesDict[key]:
+ self.csnd.loopDelete(n)
+ del self.notesDict[key]
+ if (Config.DEBUG > 3): print self.notesDict
+
+ def start(self, key, instrument, reverb):
+ if self.notesDict.has_key(key):
+ return
+ self.notesList = []
+ for i in lps.LOOPS[key][self.beat-2]:
+ note = self.createCsNote(i, instrument, reverb)
+ n = Note(0, note.trackId, self.id, note)
+ self.notesList.append(n)
+ self.id = self.id + 1
+ self.csnd.loopPlay(n,1) #add as active
+ if (Config.DEBUG > 3): print 'play loop at key: ' + str(key)
+ self.notesDict[key] = self.notesList
+ if (Config.DEBUG > 3): print self.notesDict
+
+ def adjustLoopVolume(self, volume):
+ self.volume = volume
+ for k in self.notesDict.keys():
+ for n in self.notesDict[k]:
+ self.csnd.loopUpdate(n, PARAMETER.AMPLITUDE, n.cs.amplitude*self.volume, 1)
+
+ def createCsNote(self, i, instrument, reverb):
+ onset = i[0]
+ pitch = i[1]
+ gain = i[2]*self.volume
+ duration = i[3]
+ if self.instrumentDB.instNamed[instrument].kit != None:
+ if GenerationConstants.DRUMPITCH.has_key(pitch):
+ pitch = GenerationConstants.DRUMPITCH[pitch]
+ instrument = self.instrumentDB.instNamed[ instrument ].kit[pitch].name
+ pitch = 36
+ return CSoundNote( onset = onset,
+ pitch = pitch,
+ amplitude = gain,
+ pan = 0.5,
+ duration = duration,
+ trackId = 0,
+ instrumentId = self.instrumentDB.instNamed[instrument].instrumentId,
+ reverbSend = reverb,
+ tied = False,
+ mode = 'mini')
+
+
+################ precompose all loops and write a dictionary #################
+
+ def precompose(self, maxbeat):
+ def makeGainSequence(onsetList):
+ gainSequence = []
+ append = gainSequence.append
+ for onset in onsetList:
+ if onset == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MAX_BOUNDARY, GenerationConstants.GAIN_MAX_BOUNDARY)
+ elif ( onset % Config.TICKS_PER_BEAT) == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MAX_BOUNDARY)
+ else:
+ gain = random.uniform(GenerationConstants.GAIN_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MIN_BOUNDARY)
+ append(gain)
+ return gainSequence
+
+ def makeDurationSequence(onsetList, barLength):
+ durationSequence = []
+ append = durationSequence.append
+ if len( onsetList ) > 1:
+ for i in range(len(onsetList) - 1):
+ append((onsetList[i+1] - onsetList[i]))
+ append(( barLength - onsetList[-1]))
+ elif len( onsetList ) == 1:
+ append( ( barLength - onsetList[0] ))
+ return durationSequence
+
+ def makePitchSequence(length, pitchRegularity, step, table_pitch, pitchMethod):
+ pitchSequence = []
+ append = pitchSequence.append
+ numberOfPitch = int( ( 1 - (regularity*.8) ) * 10 + 1 )
+ step = -(8 - (int(step * 8)))
+ max = len(table_pitch)-1
+ nextValue = pitchMethod.getNextValue
+ tonique = GenerationConstants.DEFAULT_TONIQUE
+ for i in range(numberOfPitch):
+ append((table_pitch[nextValue(step, max)]) + tonique)
+ restOfNotes = range( length - numberOfPitch )
+ for i in restOfNotes:
+ position = i % numberOfPitch
+ append( pitchSequence[ position ] )
+ return pitchSequence
+
+
+ def makeRythmSequence(barLength, density, regularity ):
+ rythmSequence = [0, ]
+ self.count = 0
+ lastOnsetTime = 0
+ onsetLen = len(GenerationConstants.LOOP_TABLE_ONSET_VALUES)
+
+ onsetValue = int( ( 1 - density ) * onsetLen )
+ onsetDeviation = int( ( 1 - regularity ) * 20 )
+ currentOnsetValue = onsetValue + ( random.randint( 0, onsetDeviation ) - ( onsetDeviation / 2 ) )
+ if currentOnsetValue < 0:
+ currentOnsetValue = 0
+ elif currentOnsetValue > onsetLen:
+ currentOnsetValue = onsetLen
+ else:
+ currentOnsetValue = currentOnsetValue
+
+ onsetDelta = GenerationConstants.LOOP_TABLE_ONSET_VALUES[ currentOnsetValue ]
+ listLen = range( int( barLength / Config.TICKS_PER_BEAT * 8 ) )
+ randInt = random.randint
+ for i in listLen:
+ if self.count == 0:
+ currentOnsetValue = onsetValue + ( randInt( 0, onsetDeviation ) - ( onsetDeviation / 2 ) )
+ if currentOnsetValue < 0:
+ currentOnsetValue = 0
+ elif currentOnsetValue > onsetLen:
+ currentOnsetValue = onsetLen
+ else:
+ currentOnsetValue = currentOnsetValue
+ onsetDelta = GenerationConstants.LOOP_TABLE_ONSET_VALUES[ currentOnsetValue ]
+
+ if onsetDelta == GenerationConstants.DOUBLE_TICK_DUR:
+ if self.count < (GenerationConstants.DOUBLE_HOW_MANY - 1):
+ self.count += 1
+ else:
+ self.count = 0
+ onsetTime = onsetDelta + lastOnsetTime
+ lastOnsetTime = onsetTime
+ if onsetTime < barLength:
+ rythmSequence.append(onsetTime)
+ continue
+ else:
+ break
+
+ onsetTime = onsetDelta + lastOnsetTime
+ lastOnsetTime = onsetTime
+ if onsetTime < barLength:
+ rythmSequence.append(onsetTime)
+ else:
+ break
+ return rythmSequence
+
+############ begin generate #####################
+ #file = open(Config.TAM_TAM_ROOT + '/miniTamTam/lps.py', 'w')
+ #file.write('LOOPS = {\n')
+
+ counter = 0
+ table_pitch = [-12, -10, -12, -7, -5, -4, -2, 0, 2, 0, 5, 7, 8, 10, 12]
+ table_density = [1., .92, .84, .76, .68, .6, .52, .46, .4, .46, .52, .6, .68, .76, .84, .95]
+ table_regularity = [1., .96, .9, .84, .78, .72, .66, .6, .54, .48, .42, .36, .3, .24, .18, .1]
+ table_pitchRegularity = [1., .96, .9, .84, .78, .72, .66, .6, .54, .48, .42, .36, .3, .24, .18, .1]
+ table_step = [2, 4, 3, 2, 4, 6, 5, 4, 6, 8, 7, 6, 8, 9, 8, 10]
+ table_pitchMethod = [0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3]
+
+ names = ['', '', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
+ numKeys = 5 #len(Config.LOOP_KEYS)
+ for key in range(numKeys):
+ #file.write(str(Config.LOOP_KEYS[key]) + ': [')
+ for beat in range(2, maxbeat+1):
+ density = table_density[key*3]
+ regularity = table_regularity[key*3]
+ pitchRegularity = table_pitchRegularity[key*3]
+ step = table_step[key*3]
+ pattern = table_pitchMethod[key*3]
+ if pattern == 0:
+ pitchMethod = Drunk( 5, 10 )
+ elif pattern == 1:
+ pitchMethod = DroneAndJump( 5, 10 )
+ elif pattern == 2:
+ pitchMethod = Repeter( 5, 10 )
+ elif pattern == 3:
+ pitchMethod = Loopseg( 5, 10 )
+
+ barLength = Config.TICKS_PER_BEAT * beat
+ loopList = []
+
+ rythmSequence = makeRythmSequence(barLength, density, regularity)
+ pitchSequence = makePitchSequence(len(rythmSequence), pitchRegularity, step, table_pitch, pitchMethod )
+ gainSequence = makeGainSequence(rythmSequence)
+ durationSequence = makeDurationSequence(rythmSequence, barLength)
+
+ for k in range(len(rythmSequence)):
+ loopList.append([rythmSequence[k], pitchSequence[k], gainSequence[k], durationSequence[k]])
+
+
+ f = open(Config.INSTANCE_DIR + '/loops/loop' + names[beat] + '_' + str(counter) + '.ttl', 'w')
+ print "open file"
+ f.write('page_add 1 ' + str(beat) + ' 0 [1, 1, 1, 1, 1]\n')
+ print "write page_add"
+ noteIdCount = 0
+ for l in loopList:
+ f.write('note_add %s 1 0 %s %s %s 0.5 %s 0 1 0.005 0.098 0.1 0 1000 0 edit\n' % (str(counter + noteIdCount + 1000), str(l[0]), str(l[1]), str(l[2]), str(l[3])))
+ noteIdCount += 1
+ f.close()
+ counter += 1
+
+ #if beat == maxbeat and key == (numKeys-1):
+ #file.write(str(loopList) + ']\n')
+ #elif beat != maxbeat:
+ #file.write(str(loopList) + ',\n')
+ #else:
+ #file.write(str(loopList) + '],\n')
+ #file.write('}')
+ #file.close()
diff --git a/Mini/MiniSequencer.py b/Mini/MiniSequencer.py
new file mode 100644
index 0000000..991ee13
--- /dev/null
+++ b/Mini/MiniSequencer.py
@@ -0,0 +1,139 @@
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+import gobject
+import time
+import common.Config as Config
+from common.Util.CSoundNote import CSoundNote
+from common.Util.CSoundClient import new_csound_client
+from common.Util.NoteDB import Note
+from common.Util.NoteDB import PARAMETER
+
+class MiniSequencer:
+ def __init__( self, recordButtonState, recordOverSensitivity ):
+ self.notesList = []
+ self.sequencer = []
+ self.pitchs = []
+ self.beat = 4
+ self.volume = 0.5
+ self.tempo = Config.PLAYER_TEMPO
+ self.checkOk = 0
+ self.tick = 0
+ self.id = 1000
+ self.csnd = new_csound_client()
+ self.startLooking = 0
+ self.recordState = 0
+ self.startPoint = 0
+ self.recordButtonState = recordButtonState
+ self.recordOverSensitivity = recordOverSensitivity
+ self.playbackTimeout = None
+ self.playState = 0
+
+ def setTempo( self, tempo ):
+ self.tempo = tempo
+ gobject.source_remove( self.playBackTimeout )
+ self.playState = 0
+
+ def handleRecordButton( self, widget, data=None ):
+ if not self.startLooking:
+ if widget.get_active() == True and not self.recordState:
+ self.button = 1
+ self.recordOverSensitivity( True )
+ self.beats = [i*4 for i in range(self.beat)]
+ self.upBeats = [i+2 for i in self.beats]
+ self.realTick = [i for i in range(self.beat*4)]
+ self.clearSequencer()
+ self.startLooking = 1
+ self.startPlayback()
+
+ def handleOverButton( self, widget, data=None ):
+ if not self.startLooking:
+ if widget.get_active() == True and not self.recordState:
+ self.button = 2
+ self.startLooking = 1
+ self.startPlayback()
+
+ def clearSequencer( self, widget=None ):
+ for n in self.notesList:
+ self.csnd.loopDelete(n)
+ self.notesList = []
+
+ def getPlayState( self ):
+ return self.playState
+
+ def startPlayback( self ):
+ if not self.playState:
+ self.playbackTimeout = gobject.timeout_add( int(60000/self.tempo/12), self.handleClock )
+ self.handleClock()
+ self.playState = 1
+
+ def stopPlayback( self ):
+ if self.playbackTimeout != None:
+ gobject.source_remove( self.playbackTimeout )
+ self.playbackTimeout = None
+ self.playState = 0
+
+ def recording( self, note ):
+ if self.startLooking:
+ self.sequencer = []
+ self.pitchs = []
+ self.recordState = 1
+ self.startLooking = 0
+ self.recordButtonState(self.button, True)
+ self.startPoint = int(self.csnd.loopGetTick())
+ if self.startPoint == 0:
+ self.startPoint = self.beat * Config.TICKS_PER_BEAT - 1
+ if self.recordState:
+ self.pitchs.append( note.pitch )
+ self.sequencer.append( note )
+
+ def quantize( self, onset ):
+ if ( onset % 3 ) == 0:
+ return onset
+ elif ( onset % 3 ) == 1:
+ return ( onset // 3 ) * 3
+ elif ( onset % 3 ) == 2:
+ return ( ( onset // 3 ) + 1 ) * 3
+
+ def adjustDuration( self, pitch, onset ):
+ if pitch in self.pitchs:
+ offset = int(self.csnd.loopGetTick())
+ for note in self.sequencer:
+ if note.pitch == pitch and note.onset == onset:
+ if offset > note.onset:
+ note.duration = ( offset - note.onset ) + 4
+ else:
+ note.duration = ( (offset+(self.beat*Config.TICKS_PER_BEAT)) - note.onset ) + 4
+ note.onset = self.quantize( note.onset )
+ n = Note(0, note.trackId, self.id, note)
+ self.notesList.append(n)
+ self.id = self.id + 1
+ self.csnd.loopPlay(n,1) #add as active
+
+ self.pitchs.remove( pitch )
+
+ def adjustSequencerVolume(self, volume):
+ self.volume = volume
+ for n in self.notesList:
+ self.csnd.loopUpdate(n, PARAMETER.AMPLITUDE, n.cs.amplitude*self.volume, 1)
+
+ def handleClock( self ):
+ currentTick = int(self.csnd.loopGetTick())
+ t = currentTick / 3
+ if self.tick != t:
+ self.tick = t
+ if self.startLooking:
+ if self.tick in self.beats:
+ self.recordButtonState(self.button, True)
+ if self.tick in self.upBeats:
+ self.recordButtonState(self.button, False)
+
+ if self.recordState:
+ if currentTick < self.startPoint:
+ self.checkOk = 1
+ if currentTick >= self.startPoint and self.checkOk:
+ self.checkOk = 0
+ self.recordState = 0
+ self.recordButtonState(self.button, False)
+
+ return True
diff --git a/Mini/RythmGenerator.py b/Mini/RythmGenerator.py
new file mode 100644
index 0000000..11df96e
--- /dev/null
+++ b/Mini/RythmGenerator.py
@@ -0,0 +1,79 @@
+import random
+
+import common.Config as Config
+from common.Util.CSoundNote import CSoundNote
+from common.Generation.GenerationConstants import GenerationConstants
+from GenRythm import GenRythm
+from common.Util import InstrumentDB
+
+def generator( instrument, nbeats, density, regularity, reverbSend ):
+
+ instrumentDB = InstrumentDB.getRef()
+ makeRythm = GenRythm()
+
+ noteDuration = GenerationConstants.DOUBLE_TICK_DUR / 2
+ trackId = 5
+ pan = 0.5
+ attack = 0.005
+ decay = 0.095
+ filterType = 0
+ filterCutoff = 1000
+ tied = False
+ mode = 'mini'
+
+ def makePitchSequence(length, drumPitch):
+ pitchSequence = []
+ append = pitchSequence.append
+ list = range(length)
+ max = len(drumPitch) - 1
+ for i in list:
+ append(drumPitch[ random.randint( 0, max ) ] )
+ return pitchSequence
+
+ def makeGainSequence( onsetList ):
+ gainSequence = []
+ append = gainSequence.append
+ for onset in onsetList:
+ if onset == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MAX_BOUNDARY, GenerationConstants.GAIN_MAX_BOUNDARY)
+ elif ( onset % Config.TICKS_PER_BEAT) == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MAX_BOUNDARY)
+ else:
+ gain = random.uniform(GenerationConstants.GAIN_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MIN_BOUNDARY)
+ append(gain)
+ return gainSequence
+
+ def pageGenerate( regularity, drumPitch ):
+ barLength = Config.TICKS_PER_BEAT * nbeats
+
+ #print 'pageGenerate drumPitch[0] ', drumPitch[0]
+ currentInstrument = instrumentDB.instNamed[ instrument ].kit[ drumPitch[0] ] #.name
+
+ rythmSequence = makeRythm.drumRythmSequence(currentInstrument, nbeats, density, regularity)
+ pitchSequence = makePitchSequence(len(rythmSequence), drumPitch )
+ gainSequence = makeGainSequence(rythmSequence)
+
+ trackNotes = []
+ list = range(len(rythmSequence))
+ for i in list:
+ trackNotes.append( CSoundNote( rythmSequence[i], pitchSequence[i], gainSequence[i],
+ pan, noteDuration, trackId,
+ instrumentDB.instNamed[instrument].instrumentId, attack,
+ decay, reverbSend, filterType, filterCutoff, tied, mode))
+ return trackNotes
+
+##################################################################################
+ # begin generate()
+ if regularity > 0.75:
+ streamOfPitch = GenerationConstants.DRUM_COMPLEXITY1
+ elif regularity > 0.5:
+ streamOfPitch = GenerationConstants.DRUM_COMPLEXITY2
+ elif regularity > 0.25:
+ streamOfPitch = GenerationConstants.DRUM_COMPLEXITY3
+ else:
+ streamOfPitch = GenerationConstants.DRUM_COMPLEXITY4
+
+ trackNotes = []
+ for drumPitch in streamOfPitch:
+ trackNotes.append(pageGenerate( regularity, drumPitch ))
+ return trackNotes
diff --git a/Mini/__init__.py b/Mini/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Mini/__init__.py
diff --git a/Mini/lps.py b/Mini/lps.py
new file mode 100644
index 0000000..b3c3aa8
--- /dev/null
+++ b/Mini/lps.py
@@ -0,0 +1,242 @@
+LOOPS = {
+17: [[[0, 34, 0.91843119391102157, 3], [3, 29, 0.66557397398580609, 3], [6, 34, 0.74069380274636654, 3], [9, 29, 0.73011336026847073, 3], [12, 34, 0.76424227490889152, 3], [15, 29, 0.73027362492984604, 3], [18, 34, 0.65773569328528614, 3], [21, 29, 0.68716281941809831, 3]],
+[[0, 32, 0.90350161334941659, 3], [3, 24, 0.74404055378568157, 3], [6, 32, 0.74323579104314119, 3], [9, 24, 0.73026101785761377, 3], [12, 32, 0.82564066817787785, 3], [15, 24, 0.71019876471482146, 3], [18, 32, 0.73703720538539641, 3], [21, 24, 0.72586200244648191, 3], [24, 32, 0.89346838667834039, 3], [27, 24, 0.6688220031077825, 3], [30, 32, 0.72447517622037272, 3], [33, 24, 0.71313223323927322, 3]],
+[[0, 41, 0.98493978103164381, 3], [3, 29, 0.72792048541450227, 3], [6, 41, 0.72930017355910615, 3], [9, 29, 0.7222293906157744, 3], [12, 41, 0.77214158570437674, 3], [15, 29, 0.74656945166968436, 3], [18, 41, 0.71994918422592669, 3], [21, 29, 0.65296466730336167, 3], [24, 41, 0.86548932085629293, 3], [27, 29, 0.72190994455740853, 3], [30, 41, 0.66445817032603671, 3], [33, 29, 0.65582254041511467, 3], [36, 41, 0.86288823205884557, 3], [39, 29, 0.70485424504749017, 3], [42, 41, 0.74949991272057725, 3], [45, 29, 0.74366606359847276, 3]],
+[[0, 26, 0.9209538754403952, 3], [3, 32, 0.7191358757020283, 3], [6, 26, 0.68816606744610742, 3], [9, 32, 0.70085543192049982, 3], [12, 26, 0.78074279603247598, 3], [15, 32, 0.71046570102178241, 3], [18, 26, 0.68220609744266758, 3], [21, 32, 0.68961180556278423, 3], [24, 26, 0.89235495450144287, 3], [27, 32, 0.73108765393595787, 3], [30, 26, 0.66145010684275285, 3], [33, 32, 0.71956089863127026, 3], [36, 26, 0.77770286704571423, 3], [39, 32, 0.67268162577259594, 3], [42, 26, 0.71422085398818524, 3], [45, 32, 0.73661198907206937, 3], [48, 26, 0.85268386577089572, 3], [51, 32, 0.68631312645239539, 3], [54, 26, 0.72994393067062868, 3], [57, 32, 0.70711912537539956, 3]],
+[[0, 38, 0.97737790621922072, 3], [3, 34, 0.71664569925045352, 3], [6, 38, 0.72532871185907688, 3], [9, 34, 0.68518148281936164, 3], [12, 38, 0.78925884580419003, 3], [15, 34, 0.69974203576026073, 3], [18, 38, 0.73715398854789072, 3], [21, 34, 0.68750831437785886, 3], [24, 38, 0.88144840071678221, 3], [27, 34, 0.69581579089244272, 3], [30, 38, 0.70333582484945179, 3], [33, 34, 0.70741457306014111, 3], [36, 38, 0.86425219747410853, 3], [39, 34, 0.73805060304671832, 3], [42, 38, 0.72754087855196004, 3], [45, 34, 0.65228065482349229, 3], [48, 38, 0.86104449070395883, 3], [51, 34, 0.74287398118701164, 3], [54, 38, 0.73738648278176078, 3], [57, 34, 0.65382138825928426, 3], [60, 38, 0.7633454002433121, 3], [63, 34, 0.70399019680859132, 3], [66, 38, 0.69274066551029645, 3], [69, 34, 0.70712790864283115, 3]],
+[[0, 29, 0.9553559145099455, 3], [3, 34, 0.65224509529059749, 3], [6, 29, 0.71157865209628857, 3], [9, 34, 0.70240500812668449, 3], [12, 29, 0.88616214885784961, 3], [15, 34, 0.73895635876951649, 3], [18, 29, 0.69755099539587506, 3], [21, 34, 0.65486918855381016, 3], [24, 29, 0.78336533925511442, 3], [27, 34, 0.70451467711099092, 3], [30, 29, 0.70812061038005636, 3], [33, 34, 0.66020821023721221, 3], [36, 29, 0.81117409691756392, 3], [39, 34, 0.70629416690338653, 3], [42, 29, 0.73610428492953328, 3], [45, 34, 0.67224868592999165, 3], [48, 29, 0.86358506491378484, 3], [51, 34, 0.70207585661769767, 3], [54, 29, 0.72165965378924424, 3], [57, 34, 0.73464600760895349, 3], [60, 29, 0.76646135730852416, 3], [63, 34, 0.7002474528709377, 3], [66, 29, 0.71362336661016657, 3], [69, 34, 0.6757466245495779, 3], [72, 29, 0.76143897535892247, 3], [75, 34, 0.68217145739800344, 3], [78, 29, 0.74893405173379535, 3], [81, 34, 0.68170173360898101, 3]],
+[[0, 46, 0.97552266177916414, 3], [3, 46, 0.69986456113843698, 3], [6, 46, 0.69920435077044829, 3], [9, 46, 0.68740449998560882, 3], [12, 46, 0.88277391580708886, 3], [15, 46, 0.66925646894688273, 3], [18, 46, 0.74770620434689916, 3], [21, 46, 0.67135592880972694, 3], [24, 46, 0.89774664547381655, 3], [27, 46, 0.69928909955820906, 3], [30, 46, 0.68586466042006333, 3], [33, 46, 0.70895768943399751, 3], [36, 46, 0.84986669051226882, 3], [39, 46, 0.69793940684844358, 3], [42, 46, 0.6857910200277757, 3], [45, 46, 0.7027226374974711, 3], [48, 46, 0.83941134712876864, 3], [51, 46, 0.68083838722102341, 3], [54, 46, 0.65984033342204407, 3], [57, 46, 0.672590746789269, 3], [60, 46, 0.78609392331073746, 3], [63, 46, 0.6701865146944902, 3], [66, 46, 0.65883357444463531, 3], [69, 46, 0.66052134903071158, 3], [72, 46, 0.79184461812687923, 3], [75, 46, 0.70456329331096756, 3], [78, 46, 0.74654736852481196, 3], [81, 46, 0.66733452245976943, 3], [84, 46, 0.77157082412778433, 3], [87, 46, 0.70080352704958349, 3], [90, 46, 0.74979144436734291, 3], [93, 46, 0.70122642685542769, 3]],
+[[0, 46, 0.91932873393188252, 3], [3, 46, 0.71321659243671531, 3], [6, 46, 0.69059282145586165, 3], [9, 46, 0.65981195427017847, 3], [12, 46, 0.76030046411551888, 3], [15, 46, 0.74796721544405365, 3], [18, 46, 0.74057924055206414, 3], [21, 46, 0.66775250665453612, 3], [24, 46, 0.78281128191107929, 3], [27, 46, 0.69803584249894335, 3], [30, 46, 0.69895782528552974, 3], [33, 46, 0.723529751804181, 3], [36, 46, 0.80851570969064313, 3], [39, 46, 0.67139974267760627, 3], [42, 46, 0.72305899861262568, 3], [45, 46, 0.68945043870105571, 3], [48, 46, 0.75610316508036135, 3], [51, 46, 0.71823308483606174, 3], [54, 46, 0.66865797792771575, 3], [57, 46, 0.74657517001426033, 3], [60, 46, 0.87044953529572178, 3], [63, 46, 0.7130297562104132, 3], [66, 46, 0.71351325060250659, 3], [69, 46, 0.69019654834356781, 3], [72, 46, 0.83474178641883123, 3], [75, 46, 0.74929800588928508, 3], [78, 46, 0.68958541192891742, 3], [81, 46, 0.74928116715885551, 3], [84, 46, 0.88840328031723259, 3], [87, 46, 0.65862046873085311, 3], [90, 46, 0.70878836088886332, 3], [93, 46, 0.73885958288345677, 3], [96, 46, 0.85247737085377939, 3], [99, 46, 0.6783759890234814, 3], [102, 46, 0.6825784264775937, 3], [105, 46, 0.738542711969846, 3]],
+[[0, 31, 0.94776975142287834, 3], [3, 41, 0.65590177297158159, 3], [6, 31, 0.65337976704789735, 3], [9, 41, 0.73408902426583011, 3], [12, 31, 0.84968220502602998, 3], [15, 41, 0.70095191213245678, 3], [18, 31, 0.74876524478508144, 3], [21, 41, 0.69533166848117667, 3], [24, 31, 0.85332557823377264, 3], [27, 41, 0.73955678051059492, 3], [30, 31, 0.7252274828939308, 3], [33, 41, 0.7032040738565718, 3], [36, 31, 0.78158754870669478, 3], [39, 41, 0.72361628589076143, 3], [42, 31, 0.71439844284783904, 3], [45, 41, 0.69894336744910734, 3], [48, 31, 0.8106183090724538, 3], [51, 41, 0.70613671246994514, 3], [54, 31, 0.69530745092939739, 3], [57, 41, 0.73359899948360163, 3], [60, 31, 0.89516116030556148, 3], [63, 41, 0.7090745940640214, 3], [66, 31, 0.6884971156573102, 3], [69, 41, 0.74782082130824079, 3], [72, 31, 0.83716873320941154, 3], [75, 41, 0.72114893479035447, 3], [78, 31, 0.68677684180105225, 3], [81, 41, 0.66642756025084182, 3], [84, 31, 0.80013804508992159, 3], [87, 41, 0.68693476263098707, 3], [90, 31, 0.66028364009529072, 3], [93, 41, 0.66229596381452704, 3], [96, 31, 0.88127393320261094, 3], [99, 41, 0.73074370583503645, 3], [102, 31, 0.66781201866137407, 3], [105, 41, 0.66545630618869744, 3], [108, 31, 0.75361150079657258, 3], [111, 41, 0.71854024397575067, 3], [114, 31, 0.72973386512808813, 3], [117, 41, 0.66432200189141311, 3]],
+[[0, 36, 0.98068641760396869, 3], [3, 36, 0.7087581726036245, 3], [6, 36, 0.73999909050052226, 3], [9, 36, 0.66058393549418448, 3], [12, 36, 0.77292030332125072, 3], [15, 36, 0.74928587658650037, 3], [18, 36, 0.73332890611996115, 3], [21, 36, 0.67888400552814432, 3], [24, 36, 0.82060696293857305, 3], [27, 36, 0.66036967490951815, 3], [30, 36, 0.73419017150661336, 3], [33, 36, 0.6664381430435613, 3], [36, 36, 0.85067121782355692, 3], [39, 36, 0.73011586871926704, 3], [42, 36, 0.65481380650717536, 3], [45, 36, 0.66578703136289474, 3], [48, 36, 0.76056215071595079, 3], [51, 36, 0.72235630871144041, 3], [54, 36, 0.72422860004193734, 3], [57, 36, 0.71143393824413537, 3], [60, 36, 0.85734534202384116, 3], [63, 36, 0.66017915357256374, 3], [66, 36, 0.67171228226548818, 3], [69, 36, 0.71272669092748564, 3], [72, 36, 0.8315199331948937, 3], [75, 36, 0.69174347595086216, 3], [78, 36, 0.72788282047363517, 3], [81, 36, 0.69392643322409353, 3], [84, 36, 0.79770454659537937, 3], [87, 36, 0.72739460247920895, 3], [90, 36, 0.67048753950153672, 3], [93, 36, 0.72736539131030409, 3], [96, 36, 0.80285116841828175, 3], [99, 36, 0.713718809999492, 3], [102, 36, 0.73880912377713248, 3], [105, 36, 0.68062980566222953, 3], [108, 36, 0.75214765954225038, 3], [111, 36, 0.6981475157815108, 3], [114, 36, 0.68829052906441512, 3], [117, 36, 0.71685831080048168, 3], [120, 36, 0.75248202994273161, 3], [123, 36, 0.72214570567114489, 3], [126, 36, 0.71084553127838324, 3], [129, 36, 0.65197071023926312, 3]],
+[[0, 46, 0.90280678713865126, 3], [3, 32, 0.67395093764164715, 3], [6, 46, 0.73109179842106886, 3], [9, 32, 0.67170914331957565, 3], [12, 46, 0.80307077663550952, 3], [15, 32, 0.73129358320657789, 3], [18, 46, 0.71903360938852634, 3], [21, 32, 0.7248234653347696, 3], [24, 46, 0.81714859690272912, 3], [27, 32, 0.66348355767076483, 3], [30, 46, 0.67016212651490314, 3], [33, 32, 0.66154132833276358, 3], [36, 46, 0.88048058164239262, 3], [39, 32, 0.6890403995494504, 3], [42, 46, 0.73418414850798452, 3], [45, 32, 0.749772789108889, 3], [48, 46, 0.84890407655338507, 3], [51, 32, 0.65268531302671839, 3], [54, 46, 0.73129437939088149, 3], [57, 32, 0.72989177801115146, 3], [60, 46, 0.85554234610943947, 3], [63, 32, 0.69025635663809293, 3], [66, 46, 0.65272676456968093, 3], [69, 32, 0.70601800003449144, 3], [72, 46, 0.75941955733003041, 3], [75, 32, 0.70531362992122248, 3], [78, 46, 0.70793039214726661, 3], [81, 32, 0.7365052564921184, 3], [84, 46, 0.75567849777664398, 3], [87, 32, 0.70811048770262452, 3], [90, 46, 0.73216776268556005, 3], [93, 32, 0.68187859580205246, 3], [96, 46, 0.82545401413391595, 3], [99, 32, 0.66695370191476799, 3], [102, 46, 0.73641117798869293, 3], [105, 32, 0.74101257223922112, 3], [108, 46, 0.87195002931605747, 3], [111, 32, 0.74482451358298352, 3], [114, 46, 0.66132022723666595, 3], [117, 32, 0.65565430253830792, 3], [120, 46, 0.79306575515647193, 3], [123, 32, 0.72800781978306695, 3], [126, 46, 0.72030742526565961, 3], [129, 32, 0.71176978526356594, 3], [132, 46, 0.79068051095915104, 3], [135, 32, 0.72962608505954019, 3], [138, 46, 0.66901942227248201, 3], [141, 32, 0.68098356883561206, 3]],
+[[0, 24, 0.94996784213780716, 3], [3, 24, 0.71282116076692614, 3], [6, 24, 0.71871672529819786, 3], [9, 24, 0.66273047469727364, 3], [12, 24, 0.766507966649846, 3], [15, 24, 0.69353990056816539, 3], [18, 24, 0.69938860941518211, 3], [21, 24, 0.74598532159248276, 3], [24, 24, 0.81294051419026536, 3], [27, 24, 0.73917500448603701, 3], [30, 24, 0.73681950265708818, 3], [33, 24, 0.69273172587524134, 3], [36, 24, 0.86922807695844395, 3], [39, 24, 0.72763792224268364, 3], [42, 24, 0.73950073663749138, 3], [45, 24, 0.69387556505269421, 3], [48, 24, 0.89848698451539277, 3], [51, 24, 0.6642855396985583, 3], [54, 24, 0.6953886068113142, 3], [57, 24, 0.73159770052310524, 3], [60, 24, 0.83500844769724591, 3], [63, 24, 0.71347376140571228, 3], [66, 24, 0.69196630602724796, 3], [69, 24, 0.65183324905576068, 3], [72, 24, 0.82198645068199483, 3], [75, 24, 0.69589915382384626, 3], [78, 24, 0.70111834688348473, 3], [81, 24, 0.67827302553147273, 3], [84, 24, 0.88450178396412449, 3], [87, 24, 0.7343604369087634, 3], [90, 24, 0.6827419001291879, 3], [93, 24, 0.73930446848684306, 3], [96, 24, 0.79120977614291588, 3], [99, 24, 0.70891952101331734, 3], [102, 24, 0.65553023868092064, 3], [105, 24, 0.68977243408292255, 3], [108, 24, 0.77703598487780079, 3], [111, 24, 0.69538143527301099, 3], [114, 24, 0.68306239968458615, 3], [117, 24, 0.74317390320358623, 3], [120, 24, 0.80334349366584712, 3], [123, 24, 0.68405445266280651, 3], [126, 24, 0.66659853120983548, 3], [129, 24, 0.71501227960244906, 3], [132, 24, 0.82324897961345989, 3], [135, 24, 0.70431450253673944, 3], [138, 24, 0.667598228369227, 3], [141, 24, 0.7230375182466019, 3], [144, 24, 0.79965565220353951, 3], [147, 24, 0.73817545621760028, 3], [150, 24, 0.7440681955330154, 3], [153, 24, 0.7228687635049964, 3]],
+[[0, 24, 0.99966154454043432, 3], [3, 36, 0.72418981430429774, 3], [6, 24, 0.70518891566238151, 3], [9, 36, 0.69807416917517928, 3], [12, 24, 0.79855094267840476, 3], [15, 36, 0.73561616111895778, 3], [18, 24, 0.70810061059214147, 3], [21, 36, 0.68153876715530248, 3], [24, 24, 0.76427434335396438, 3], [27, 36, 0.70006637530314653, 3], [30, 24, 0.73615450050080466, 3], [33, 36, 0.68792120830514814, 3], [36, 24, 0.76588204089615519, 3], [39, 36, 0.67574733551391175, 3], [42, 24, 0.65061915087821531, 3], [45, 36, 0.69092660922113514, 3], [48, 24, 0.85249527480752418, 3], [51, 36, 0.72230801799116062, 3], [54, 24, 0.73274518894797158, 3], [57, 36, 0.66329666666212961, 3], [60, 24, 0.75175967538048838, 3], [63, 36, 0.67622270427738218, 3], [66, 24, 0.72583832150850824, 3], [69, 36, 0.6917055364091359, 3], [72, 24, 0.78348574978638708, 3], [75, 36, 0.73000322507677406, 3], [78, 24, 0.73063779629050585, 3], [81, 36, 0.65402740075456278, 3], [84, 24, 0.80011577068599138, 3], [87, 36, 0.71303511836768496, 3], [90, 24, 0.6934017049718888, 3], [93, 36, 0.70343131927951874, 3], [96, 24, 0.78259572323155779, 3], [99, 36, 0.72858981621488073, 3], [102, 24, 0.7481560231694101, 3], [105, 36, 0.68755827931530411, 3], [108, 24, 0.88206819747354581, 3], [111, 36, 0.72616984943512353, 3], [114, 24, 0.74256950141685751, 3], [117, 36, 0.66158134924215217, 3], [120, 24, 0.76246240828234202, 3], [123, 36, 0.74856742595044767, 3], [126, 24, 0.68420976932639477, 3], [129, 36, 0.66434498040744627, 3], [132, 24, 0.81473844231294035, 3], [135, 36, 0.7131631978481362, 3], [138, 24, 0.73930693395247316, 3], [141, 36, 0.65070235342238492, 3], [144, 24, 0.84393407785915298, 3], [147, 36, 0.7394095318691658, 3], [150, 24, 0.70080455363741645, 3], [153, 36, 0.70464392031853151, 3], [156, 24, 0.8525907875365486, 3], [159, 36, 0.726693437214738, 3], [162, 24, 0.74428130134819526, 3], [165, 36, 0.65639627649148768, 3]],
+[[0, 43, 0.96932979317400125, 3], [3, 48, 0.72174357367422148, 3], [6, 43, 0.67568473222070091, 3], [9, 48, 0.67902133423992483, 3], [12, 43, 0.77530901011594411, 3], [15, 48, 0.65763043577326386, 3], [18, 43, 0.72235842039905918, 3], [21, 48, 0.73049883177095876, 3], [24, 43, 0.84674159070444155, 3], [27, 48, 0.68140428605264913, 3], [30, 43, 0.70876217651075257, 3], [33, 48, 0.71138176998035574, 3], [36, 43, 0.81157816581707343, 3], [39, 48, 0.72597690885886701, 3], [42, 43, 0.65859686769784942, 3], [45, 48, 0.67944998870694162, 3], [48, 43, 0.78805682820876111, 3], [51, 48, 0.72573389983179815, 3], [54, 43, 0.72752262764470577, 3], [57, 48, 0.71254422734755252, 3], [60, 43, 0.81410989190505889, 3], [63, 48, 0.74347871298751889, 3], [66, 43, 0.65280748129230837, 3], [69, 48, 0.734768604573383, 3], [72, 43, 0.8660114662893712, 3], [75, 48, 0.67310548891235633, 3], [78, 43, 0.65811503908707281, 3], [81, 48, 0.73069394322859826, 3], [84, 43, 0.81497037169863573, 3], [87, 48, 0.66833091293351143, 3], [90, 43, 0.66290555752105784, 3], [93, 48, 0.73975604912512694, 3], [96, 43, 0.85298710843815095, 3], [99, 48, 0.72481474740676421, 3], [102, 43, 0.71748055944001021, 3], [105, 48, 0.66779334973360249, 3], [108, 43, 0.88148481633884068, 3], [111, 48, 0.70970250344499031, 3], [114, 43, 0.66045623145991794, 3], [117, 48, 0.70323316891770704, 3], [120, 43, 0.75633466439463315, 3], [123, 48, 0.7445744239461779, 3], [126, 43, 0.71390527840946916, 3], [129, 48, 0.65618291702082587, 3], [132, 43, 0.84268279604292473, 3], [135, 48, 0.68148552249145045, 3], [138, 43, 0.7058720811582202, 3], [141, 48, 0.7050479148335731, 3], [144, 43, 0.8114068029400161, 3], [147, 48, 0.68990423286144009, 3], [150, 43, 0.67216246535605217, 3], [153, 48, 0.65316101456349407, 3], [156, 43, 0.81678837823150263, 3], [159, 48, 0.69329211099146271, 3], [162, 43, 0.72741608592838003, 3], [165, 48, 0.68352397512556962, 3], [168, 43, 0.85539312382434651, 3], [171, 48, 0.67189211679880723, 3], [174, 43, 0.68223496609823819, 3], [177, 48, 0.73544014586003525, 3]],
+[[0, 43, 0.90070611794486921, 3], [3, 34, 0.74282268176871691, 3], [6, 43, 0.68756710950549593, 3], [9, 34, 0.71555053212403752, 3], [12, 43, 0.76034242153260345, 3], [15, 34, 0.67730951568915243, 3], [18, 43, 0.69867346554167542, 3], [21, 34, 0.72558397880899772, 3], [24, 43, 0.85196281806864038, 3], [27, 34, 0.71570624740986799, 3], [30, 43, 0.73508694738983504, 3], [33, 34, 0.69032090145731495, 3], [36, 43, 0.87437358820505495, 3], [39, 34, 0.67342402729972539, 3], [42, 43, 0.69178382616826939, 3], [45, 34, 0.65336233070370653, 3], [48, 43, 0.85800776964317116, 3], [51, 34, 0.69188256970622852, 3], [54, 43, 0.73181839013005545, 3], [57, 34, 0.70770196933922702, 3], [60, 43, 0.83915983734872024, 3], [63, 34, 0.65217804226086096, 3], [66, 43, 0.73448277533520967, 3], [69, 34, 0.73179836697977318, 3], [72, 43, 0.87487891765990311, 3], [75, 34, 0.67044362226809739, 3], [78, 43, 0.70264371065192099, 3], [81, 34, 0.71179057931519618, 3], [84, 43, 0.8740242335524433, 3], [87, 34, 0.69210335033522996, 3], [90, 43, 0.73057490552554627, 3], [93, 34, 0.65742593937409655, 3], [96, 43, 0.897216068824921, 3], [99, 34, 0.67552534074440329, 3], [102, 43, 0.74842407010643885, 3], [105, 34, 0.72578731701562393, 3], [108, 43, 0.84346855188787839, 3], [111, 34, 0.74231512292010116, 3], [114, 43, 0.67456721807401698, 3], [117, 34, 0.70819009938384825, 3], [120, 43, 0.81123700980151492, 3], [123, 34, 0.72871523616383049, 3], [126, 43, 0.74519955954895623, 3], [129, 34, 0.70862154181656833, 3], [132, 43, 0.77956677877797065, 3], [135, 34, 0.7194435062283101, 3], [138, 43, 0.74730077767578429, 3], [141, 34, 0.73315911209236784, 3], [144, 43, 0.75119069282266837, 3], [147, 34, 0.72228001165625955, 3], [150, 43, 0.69583937906463833, 3], [153, 34, 0.72087765015931737, 3], [156, 43, 0.80052711545829425, 3], [159, 34, 0.67415900077645352, 3], [162, 43, 0.71667846452839012, 3], [165, 34, 0.73559050106293478, 3], [168, 43, 0.88190771301091475, 3], [171, 34, 0.70108873146445061, 3], [174, 43, 0.74833356473128465, 3], [177, 34, 0.74947652198211712, 3], [180, 43, 0.81158745527123677, 3], [183, 34, 0.71436322179635559, 3], [186, 43, 0.69504136381694614, 3], [189, 34, 0.69881967450638305, 3]]],
+18: [[[0, 31, 0.91414618042602414, 6], [6, 24, 0.71298982497012386, 6], [12, 32, 0.81303870130608091, 6], [18, 31, 0.70146204478484941, 6]],
+[[0, 24, 0.97420972018144714, 6], [6, 31, 0.65348467360822149, 6], [12, 26, 0.77999759911164923, 6], [18, 24, 0.71499756985534457, 6], [24, 31, 0.76545679617275186, 6], [30, 26, 0.72464043627105301, 6]],
+[[0, 32, 0.96839746371031044, 6], [6, 24, 0.7383135519270827, 6], [12, 26, 0.83678727084047755, 6], [18, 32, 0.68084753804273135, 6], [24, 24, 0.89662063033423611, 6], [30, 26, 0.72027994167313425, 6], [36, 32, 0.88742383921005208, 6], [42, 24, 0.73401091932155238, 6]],
+[[0, 26, 0.96443993724085353, 6], [6, 26, 0.70614731515727813, 6], [12, 26, 0.86340896185180149, 6], [18, 26, 0.74664344369869817, 6], [24, 26, 0.86543903819381884, 6], [30, 26, 0.70031407028854142, 6], [36, 26, 0.80326482970805313, 6], [42, 26, 0.70401718046397721, 6], [48, 26, 0.81717235550659439, 6], [54, 26, 0.73439827435161797, 6]],
+[[0, 26, 0.93948955420019553, 6], [6, 48, 0.65732513243916579, 6], [12, 46, 0.88186182846858496, 6], [18, 26, 0.70620376639714333, 6], [24, 48, 0.89829471318820886, 6], [30, 46, 0.70047567652877019, 6], [36, 26, 0.81028053931891619, 6], [42, 48, 0.6945929689786895, 6], [48, 46, 0.82544710578597713, 6], [54, 26, 0.68096995635386004, 6], [60, 48, 0.7948285180804705, 6], [66, 46, 0.72425718868680433, 6]],
+[[0, 41, 0.92057821058714318, 6], [6, 44, 0.65222437973498593, 6], [12, 24, 0.78839760337611409, 6], [18, 41, 0.66331590721149958, 6], [24, 44, 0.79211585725194678, 6], [30, 24, 0.67054673328728542, 6], [36, 41, 0.86212326778691173, 6], [42, 44, 0.69940801572645628, 6], [48, 24, 0.83188758283454201, 6], [54, 41, 0.74770707328981179, 6], [60, 44, 0.85141841724608025, 6], [66, 24, 0.74140482326703583, 6], [72, 41, 0.87846458088135293, 6], [78, 44, 0.73968773189193271, 6]],
+[[0, 41, 0.94009838336255835, 6], [6, 24, 0.74321383382950013, 6], [12, 24, 0.86544259358995879, 6], [18, 41, 0.67390648995027747, 6], [24, 24, 0.81848211684852012, 6], [30, 24, 0.72188229872365828, 6], [36, 41, 0.81199373434272537, 6], [42, 24, 0.73862007747014657, 6], [48, 24, 0.78500136053179559, 6], [54, 41, 0.74262644148484658, 6], [60, 24, 0.87569372608219065, 6], [66, 24, 0.72781277908185293, 6], [72, 41, 0.88136371399873692, 6], [78, 24, 0.68464806384325505, 6], [84, 24, 0.81710953214328508, 6], [90, 41, 0.73295279908643851, 6]],
+[[0, 38, 0.95847151264927133, 6], [6, 38, 0.72675011545177171, 6], [12, 46, 0.88872965225929113, 6], [18, 38, 0.67495323003089802, 6], [24, 38, 0.77612948128315384, 6], [30, 46, 0.66215329978950488, 6], [36, 38, 0.82684692918756486, 6], [42, 38, 0.73556518773644564, 6], [48, 46, 0.83193093370565208, 6], [54, 38, 0.72003903534059566, 6], [60, 38, 0.77075151079904158, 6], [66, 46, 0.66929193857581626, 6], [72, 38, 0.82784830145602162, 6], [78, 38, 0.67455784048709766, 6], [84, 46, 0.86308083323833107, 6], [90, 38, 0.7482013005918986, 6], [96, 38, 0.75696777108937152, 6], [102, 46, 0.74637868553636455, 6]],
+[[0, 36, 0.92447775497671825, 6], [6, 48, 0.74898108333582325, 6], [12, 29, 0.78663337787438081, 6], [18, 36, 0.65611981652688578, 6], [24, 48, 0.8105687254909405, 6], [30, 29, 0.74161952353006511, 6], [36, 36, 0.86338804652305545, 6], [42, 48, 0.69244908097989222, 6], [48, 29, 0.78251088805851521, 6], [54, 36, 0.65973106118254299, 6], [60, 48, 0.87082007465301114, 6], [66, 29, 0.72185529587579123, 6], [72, 36, 0.76260547137057366, 6], [78, 48, 0.71322132319309894, 6], [84, 29, 0.8698480505616164, 6], [90, 36, 0.74330892636732815, 6], [96, 48, 0.75737903656665917, 6], [102, 29, 0.70274783895554316, 6], [108, 36, 0.88525634845631163, 6], [114, 48, 0.67840890071368631, 6]],
+[[0, 36, 0.99295245890118389, 6], [6, 38, 0.65655867395509682, 6], [12, 41, 0.81092730969330673, 6], [18, 36, 0.74755276683545802, 6], [24, 38, 0.80157940166642683, 6], [30, 41, 0.7064467513123267, 6], [36, 36, 0.85549444601390323, 6], [42, 38, 0.65451918363439476, 6], [48, 41, 0.81854341475983905, 6], [54, 36, 0.69039973128191101, 6], [60, 38, 0.88866133699943328, 6], [66, 41, 0.73502888347862672, 6], [72, 36, 0.8062119553326883, 6], [78, 38, 0.72921143414383771, 6], [84, 41, 0.86630353159134776, 6], [90, 36, 0.68782836978771866, 6], [96, 38, 0.80356547921222932, 6], [102, 41, 0.69164971959839694, 6], [108, 36, 0.88119058150873397, 6], [114, 38, 0.67792047941432731, 6], [120, 41, 0.8623603156626285, 6], [126, 36, 0.7304323057199329, 6]],
+[[0, 46, 0.94455882891483811, 6], [6, 32, 0.6810109373883827, 6], [12, 26, 0.87276983732939439, 6], [18, 46, 0.73947851796835629, 6], [24, 32, 0.78333238100616298, 6], [30, 26, 0.69772457494512086, 6], [36, 46, 0.78120313282331566, 6], [42, 32, 0.74411907655668541, 6], [48, 26, 0.83798882293933119, 6], [54, 46, 0.68423534706676037, 6], [60, 32, 0.81270950196556724, 6], [66, 26, 0.68382277221523335, 6], [72, 46, 0.79647688385855819, 6], [78, 32, 0.74788918762374357, 6], [84, 26, 0.8793117655163567, 6], [90, 46, 0.72417061948939387, 6], [96, 32, 0.86054454376731371, 6], [102, 26, 0.7053740118504882, 6], [108, 46, 0.87171422383591191, 6], [114, 32, 0.67032848719549132, 6], [120, 26, 0.83949593519135435, 6], [126, 46, 0.71247187183526028, 6], [132, 32, 0.78113447005843439, 6], [138, 26, 0.66411769371662599, 6]],
+[[0, 26, 0.90565978750069465, 6], [6, 24, 0.67681864236441625, 6], [12, 36, 0.78586352121137937, 6], [18, 26, 0.71662389509200997, 6], [24, 24, 0.81836354230284503, 6], [30, 36, 0.66640355255582384, 6], [36, 26, 0.80442025759528168, 6], [42, 24, 0.67140460828688076, 6], [48, 36, 0.89157511528241817, 6], [54, 26, 0.71753496307853903, 6], [60, 24, 0.78986310628124778, 6], [66, 36, 0.7001842582953044, 6], [72, 26, 0.80250928733914095, 6], [78, 24, 0.67802578112400336, 6], [84, 36, 0.88866503232395422, 6], [90, 26, 0.68689690864617647, 6], [96, 24, 0.75556326417677289, 6], [102, 36, 0.65608272171718496, 6], [108, 26, 0.8426217626322362, 6], [114, 24, 0.67980098180445103, 6], [120, 36, 0.87918556644956747, 6], [126, 26, 0.71480632484083184, 6], [132, 24, 0.76449998432112509, 6], [138, 36, 0.72310965206758104, 6], [144, 26, 0.8147357033027981, 6], [150, 24, 0.72242852551843351, 6]],
+[[0, 32, 0.9891347085579848, 6], [6, 36, 0.73948461475056693, 6], [12, 36, 0.84663465433464979, 6], [18, 32, 0.71105824965696485, 6], [24, 36, 0.85158941097494467, 6], [30, 36, 0.69583467680036515, 6], [36, 32, 0.75897954529379597, 6], [42, 36, 0.70952493107413617, 6], [48, 36, 0.81384898433683095, 6], [54, 32, 0.71840608920653048, 6], [60, 36, 0.75884114227416599, 6], [66, 36, 0.6568825801183944, 6], [72, 32, 0.80931947506039315, 6], [78, 36, 0.66498770263468931, 6], [84, 36, 0.88957526419840982, 6], [90, 32, 0.67516181964593269, 6], [96, 36, 0.87455783664068143, 6], [102, 36, 0.70414890031389965, 6], [108, 32, 0.81041903265786275, 6], [114, 36, 0.74647617019814616, 6], [120, 36, 0.80494267638514438, 6], [126, 32, 0.68439575086321569, 6], [132, 36, 0.83772021370581284, 6], [138, 36, 0.7207547932256424, 6], [144, 32, 0.84417151210749997, 6], [150, 36, 0.67110055897756804, 6], [156, 36, 0.85180644696505547, 6], [162, 32, 0.70408297062537373, 6]],
+[[0, 36, 0.94589750324498256, 6], [6, 31, 0.70650683889275501, 6], [12, 34, 0.89678386444311187, 6], [18, 36, 0.7116444156767342, 6], [24, 31, 0.89796917050081404, 6], [30, 34, 0.65024508188908459, 6], [36, 36, 0.8008470032993964, 6], [42, 31, 0.68252737723740464, 6], [48, 34, 0.85843801756684446, 6], [54, 36, 0.68629079690778361, 6], [60, 31, 0.80946932600696209, 6], [66, 34, 0.73490689580634017, 6], [72, 36, 0.89175551635831085, 6], [78, 31, 0.69913107125809237, 6], [84, 34, 0.81483156589591899, 6], [90, 36, 0.73517468116067142, 6], [96, 31, 0.82596648659422511, 6], [102, 34, 0.74675078788427196, 6], [108, 36, 0.77790562228419935, 6], [114, 31, 0.67204065617652731, 6], [120, 34, 0.76399141844249108, 6], [126, 36, 0.65249573238827652, 6], [132, 31, 0.86095508523032638, 6], [138, 34, 0.65472001970391147, 6], [144, 36, 0.77812733868646256, 6], [150, 31, 0.68510817247022471, 6], [156, 34, 0.88989614259769378, 6], [162, 36, 0.73552798134010744, 6], [168, 31, 0.76926192377091696, 6], [174, 34, 0.74873584937582416, 6]],
+[[0, 36, 0.94710018697646181, 6], [6, 36, 0.72684070002106593, 6], [12, 24, 0.85379997602992486, 6], [18, 36, 0.70912352509215126, 6], [24, 36, 0.82986901252819634, 6], [30, 24, 0.70840303930267656, 6], [36, 36, 0.80164657570930964, 6], [42, 36, 0.73841986592218956, 6], [48, 24, 0.80721952126894747, 6], [54, 36, 0.68374162078322098, 6], [60, 36, 0.77333538062365392, 6], [66, 24, 0.69864655313561985, 6], [72, 36, 0.86252711987885078, 6], [78, 36, 0.7448207834776871, 6], [84, 24, 0.85545685230388446, 6], [90, 36, 0.66720136156626852, 6], [96, 36, 0.76588239857602491, 6], [102, 24, 0.66745273686057272, 6], [108, 36, 0.78249428968569967, 6], [114, 36, 0.67057374235540768, 6], [120, 24, 0.85316687911401845, 6], [126, 36, 0.67726681032408231, 6], [132, 36, 0.88903529313140184, 6], [138, 24, 0.6519536663260781, 6], [144, 36, 0.76972252753882509, 6], [150, 36, 0.68471346262760124, 6], [156, 24, 0.88373813895967146, 6], [162, 36, 0.69987876485566869, 6], [168, 36, 0.85836647298749191, 6], [174, 24, 0.71623382999520202, 6], [180, 36, 0.85712602985806086, 6], [186, 36, 0.7496672794348419, 6]]],
+19: [[[0, 34, 0.94343743899849775, 12], [12, 48, 0.87445529179868864, 12]],
+[[0, 26, 0.99207816588077435, 6], [6, 24, 0.74385675189819744, 6], [12, 38, 0.79547069010091043, 12], [24, 26, 0.88615671714874711, 6], [30, 24, 0.74777031301955554, 6]],
+[[0, 24, 0.99927423561350259, 12], [12, 24, 0.78692866392335359, 6], [18, 24, 0.69262010288662523, 12], [30, 24, 0.72390730316997276, 12], [42, 24, 0.666115258605529, 6]],
+[[0, 41, 0.99357613169079517, 6], [6, 43, 0.7073630308078257, 12], [18, 46, 0.67165574765193869, 6], [24, 41, 0.86565397555446555, 6], [30, 43, 0.70515213162208334, 6], [36, 46, 0.83971310744003536, 6], [42, 41, 0.74076808030659258, 6], [48, 43, 0.87503158586961882, 12]],
+[[0, 31, 0.9123356313814982, 12], [12, 24, 0.83145940848174249, 12], [24, 31, 0.76565291891357168, 6], [30, 31, 0.72491054618626705, 12], [42, 24, 0.68248618794605331, 12], [54, 31, 0.67093741643924965, 12], [66, 31, 0.70817819944886784, 6]],
+[[0, 46, 0.92394070210858636, 12], [12, 29, 0.78872650461199467, 6], [18, 26, 0.72562351702164596, 12], [30, 46, 0.74624235514010628, 12], [42, 29, 0.74032753000068696, 12], [54, 26, 0.70470937639439069, 12], [66, 46, 0.66702062408473006, 6], [72, 29, 0.76288048605548153, 6], [78, 26, 0.7329026924423967, 6]],
+[[0, 46, 0.9218207823690846, 6], [6, 46, 0.72440415689507387, 6], [12, 46, 0.88291257333910766, 6], [18, 46, 0.65488744402675281, 6], [24, 46, 0.80297114145541504, 12], [36, 46, 0.78810916398459085, 6], [42, 46, 0.66855234661045393, 12], [54, 46, 0.69394552129400777, 12], [66, 46, 0.70684436588875521, 6], [72, 46, 0.8222465872758461, 6], [78, 46, 0.68257743752959854, 6], [84, 46, 0.87804691525871004, 12]],
+[[0, 34, 0.91712879391530266, 12], [12, 24, 0.79097271454287843, 6], [18, 31, 0.66997267166612795, 12], [30, 34, 0.65215984388685366, 6], [36, 24, 0.84259825042217762, 6], [42, 31, 0.66169689160942169, 12], [54, 34, 0.73587904207459476, 6], [60, 24, 0.78907779607308481, 12], [72, 31, 0.80588822352186296, 6], [78, 34, 0.67792808610894528, 12], [90, 24, 0.67743285776228535, 6], [96, 31, 0.80550702000857322, 12]],
+[[0, 32, 0.96581436599992743, 6], [6, 38, 0.73648904141743765, 6], [12, 29, 0.82737735764129694, 6], [18, 32, 0.68251833638103676, 12], [30, 38, 0.68786770972571565, 6], [36, 29, 0.86036448686333278, 6], [42, 32, 0.6633101084571017, 6], [48, 38, 0.77602792136189669, 12], [60, 29, 0.86839390590114118, 12], [72, 32, 0.75505394707711893, 12], [84, 38, 0.87067826104324997, 12], [96, 29, 0.89912005558077346, 12], [108, 32, 0.80977388681856033, 12]],
+[[0, 36, 0.95237975305506806, 12], [12, 43, 0.79782767577304281, 6], [18, 44, 0.65882741671892353, 12], [30, 36, 0.70293047178636514, 12], [42, 43, 0.72147256122516235, 6], [48, 44, 0.84008159104437585, 6], [54, 36, 0.74811384646756707, 6], [60, 43, 0.82222632655187256, 12], [72, 44, 0.87448240113171305, 6], [78, 36, 0.70588912234932855, 6], [84, 43, 0.75276075255447406, 12], [96, 44, 0.87242390448924156, 6], [102, 36, 0.66594745974422076, 12], [114, 43, 0.67948801775363488, 6], [120, 44, 0.86992628936869776, 12]],
+[[0, 41, 0.99112777222264126, 12], [12, 43, 0.89087589773039566, 6], [18, 24, 0.66665736656470376, 6], [24, 41, 0.81555866935308441, 12], [36, 43, 0.78481740812663858, 6], [42, 24, 0.7385447068904949, 12], [54, 41, 0.73780369565835724, 12], [66, 43, 0.65535713405674512, 6], [72, 24, 0.83339358103909855, 6], [78, 41, 0.68674436638729652, 12], [90, 43, 0.70567375337769089, 6], [96, 24, 0.8875537063905713, 6], [102, 41, 0.65666804404080437, 12], [114, 43, 0.74554552396077245, 12], [126, 24, 0.66715146929363489, 6], [132, 41, 0.80316538377684377, 12]],
+[[0, 44, 0.93954441258885535, 12], [12, 31, 0.81913320000678491, 6], [18, 36, 0.680695532249593, 6], [24, 44, 0.8366894534153847, 12], [36, 31, 0.8026552596243991, 6], [42, 36, 0.71772009999836484, 12], [54, 44, 0.69858297237761746, 12], [66, 31, 0.67484326856240484, 12], [78, 36, 0.74191565608174237, 6], [84, 44, 0.80184860855811824, 12], [96, 31, 0.80682965406632745, 12], [108, 36, 0.8142615979036294, 12], [120, 44, 0.8607866310901513, 12], [132, 31, 0.75411793727840359, 6], [138, 36, 0.71103864722197963, 6], [144, 44, 0.76985401780218166, 12]],
+[[0, 24, 0.94644716188105837, 12], [12, 36, 0.85503731016428808, 6], [18, 36, 0.71352189483536232, 6], [24, 24, 0.79053536431115368, 6], [30, 36, 0.70695166452783642, 12], [42, 36, 0.65455966526918685, 6], [48, 24, 0.76423504228572459, 12], [60, 36, 0.76915281186912199, 6], [66, 36, 0.70310761676294375, 12], [78, 24, 0.74492489152756003, 12], [90, 36, 0.71460228182527263, 12], [102, 36, 0.69235583999833594, 12], [114, 24, 0.67593345603784627, 6], [120, 36, 0.84891889178439683, 6], [126, 36, 0.73322349229537309, 12], [138, 24, 0.74127056481376319, 6], [144, 36, 0.8489318392539299, 6], [150, 36, 0.6893822808642277, 6], [156, 24, 0.77615268994022746, 12]],
+[[0, 48, 0.95351308655706091, 12], [12, 44, 0.81395010801511614, 6], [18, 24, 0.7248530757656475, 12], [30, 48, 0.69041849421854029, 6], [36, 44, 0.89326880051449176, 12], [48, 24, 0.8853413229192042, 6], [54, 48, 0.68633025566929762, 12], [66, 44, 0.73566893023118451, 12], [78, 24, 0.73204681176690944, 6], [84, 48, 0.79444090992707872, 12], [96, 44, 0.75303513980062253, 12], [108, 24, 0.77053612037738262, 6], [114, 48, 0.67989534752713043, 12], [126, 44, 0.7452635327884618, 12], [138, 24, 0.67974627183837089, 6], [144, 48, 0.78328325060007897, 6], [150, 44, 0.66883488052235407, 12], [162, 24, 0.74997648748842005, 6], [168, 48, 0.8046815877859248, 6], [174, 44, 0.71021969318216871, 6]],
+[[0, 24, 0.98048614423414093, 12], [12, 34, 0.84487667849534698, 12], [24, 48, 0.85057712677086039, 12], [36, 24, 0.79237595462017762, 6], [42, 34, 0.70513567014739098, 12], [54, 48, 0.66377688614216723, 6], [60, 24, 0.86199370333672676, 12], [72, 34, 0.85788789570493051, 12], [84, 48, 0.7733016197546515, 12], [96, 24, 0.80343083891505451, 12], [108, 34, 0.7717252576335728, 12], [120, 48, 0.86587977527054349, 6], [126, 24, 0.74810256626940796, 6], [132, 34, 0.89391321275001612, 12], [144, 48, 0.8976384557926822, 6], [150, 24, 0.68760464437545943, 12], [162, 34, 0.65471135483412579, 6], [168, 48, 0.8582503974666652, 12], [180, 24, 0.76598962106467339, 12]]],
+20: [[[0, 48, 0.9334435604891832, 6], [6, 46, 0.69477422563241897, 12], [18, 41, 0.70190370619627462, 6]],
+[[0, 36, 0.90972975437806025, 3], [3, 48, 0.74725094097541223, 3], [6, 36, 0.72093733166115115, 3], [9, 36, 0.66874994735892934, 3], [12, 36, 0.84758350745979916, 12], [24, 48, 0.80646774351209127, 3], [27, 36, 0.66735985598565328, 3], [30, 36, 0.67882520133750379, 3], [33, 36, 0.72995464755515871, 3]],
+[[0, 46, 0.92401495794243227, 12], [12, 38, 0.79436811442026689, 6], [18, 44, 0.70702203670973607, 3], [21, 31, 0.66643818643142994, 3], [24, 46, 0.89023538543833058, 3], [27, 38, 0.68124489389695009, 3], [30, 44, 0.71791153703604638, 12], [42, 31, 0.72678065576732043, 6]],
+[[0, 26, 0.91019761440664004, 6], [6, 24, 0.71857198104916264, 6], [12, 24, 0.8884177320837201, 6], [18, 29, 0.71211690742264988, 6], [24, 26, 0.87935334114351438, 3], [27, 24, 0.72910623612054448, 3], [30, 24, 0.68790546879092551, 12], [42, 29, 0.71739190786382701, 3], [45, 26, 0.65665369348985159, 3], [48, 24, 0.85744299702705085, 6], [54, 24, 0.68461209224652642, 3], [57, 29, 0.67824637944893018, 3]],
+[[0, 41, 0.99899372523353847, 12], [12, 36, 0.84218460950513219, 6], [18, 36, 0.74898885127447534, 6], [24, 36, 0.81088761007257193, 12], [36, 41, 0.78946786680115755, 12], [48, 36, 0.81011272034370285, 12], [60, 36, 0.83186695924059617, 12]],
+[[0, 44, 0.97868861386704975, 6], [6, 44, 0.68683717205219552, 6], [12, 48, 0.80771601074539445, 6], [18, 36, 0.68804077468553426, 12], [30, 44, 0.65786274396703259, 6], [36, 44, 0.81618762166174463, 12], [48, 48, 0.88701701353628892, 12], [60, 36, 0.75810899725813652, 6], [66, 44, 0.7329045414874108, 6], [72, 44, 0.88478804162024283, 3], [75, 48, 0.74337903142851336, 3], [78, 36, 0.67724551654537934, 6]],
+[[0, 36, 0.95868246835640758, 3], [3, 48, 0.73066875515745011, 3], [6, 46, 0.66270872253412183, 6], [12, 46, 0.89910792845453491, 6], [18, 36, 0.72317824890282434, 12], [30, 48, 0.73048517956742676, 6], [36, 46, 0.7982647556744471, 3], [39, 46, 0.68022576192612072, 3], [42, 36, 0.68340009259599355, 3], [45, 48, 0.65921691345868128, 3], [48, 46, 0.80038709216342097, 12], [60, 46, 0.75640770007973923, 3], [63, 36, 0.734152853561995, 3], [66, 48, 0.65494433470006885, 3], [69, 46, 0.70082679622548893, 3], [72, 46, 0.89967598786710212, 3], [75, 36, 0.65368600341825578, 3], [78, 48, 0.69003835128878754, 6], [84, 46, 0.88314914621514129, 6], [90, 46, 0.74299900629704951, 6]],
+[[0, 32, 0.9128820526720155, 3], [3, 36, 0.66939154925302169, 3], [6, 32, 0.71892189630359815, 3], [9, 44, 0.73776960671360925, 3], [12, 32, 0.87992118948817066, 6], [18, 36, 0.6532638774187598, 6], [24, 32, 0.84038267243042464, 3], [27, 44, 0.67993318544563763, 3], [30, 32, 0.66063243929586235, 6], [36, 36, 0.89547687299016476, 12], [48, 32, 0.8566375212526679, 6], [54, 44, 0.65374183750140691, 12], [66, 32, 0.65578565423934754, 6], [72, 36, 0.77966695794833951, 12], [84, 32, 0.76116014488654549, 3], [87, 44, 0.68642087704565524, 3], [90, 32, 0.67258545803086844, 12], [102, 36, 0.74135957122562013, 6]],
+[[0, 46, 0.93241514684413163, 6], [6, 48, 0.72390894107288539, 6], [12, 43, 0.84918631031979552, 12], [24, 43, 0.86675833056105944, 6], [30, 46, 0.74766829625436082, 3], [33, 48, 0.72245673457783011, 3], [36, 43, 0.83116877166077729, 3], [39, 43, 0.74994990262731076, 3], [42, 46, 0.69740095676188352, 3], [45, 48, 0.70781119984062235, 3], [48, 43, 0.78451617188720446, 6], [54, 43, 0.72602968929805578, 6], [60, 46, 0.79285483468459161, 3], [63, 48, 0.65526666295273917, 3], [66, 43, 0.66222310585679933, 3], [69, 43, 0.73326341502039272, 3], [72, 46, 0.83037398398650941, 6], [78, 48, 0.74584542038957791, 6], [84, 43, 0.76763285194453934, 6], [90, 43, 0.74372467679243548, 12], [102, 46, 0.67017104194121524, 3], [105, 48, 0.65983771301136807, 3], [108, 43, 0.8935980295278767, 3], [111, 43, 0.66518575285368309, 3], [114, 46, 0.66851356385176597, 6]],
+[[0, 44, 0.90800408710065272, 12], [12, 36, 0.75922412283743212, 12], [24, 32, 0.82618518247614992, 6], [30, 44, 0.70760528022178593, 3], [33, 44, 0.68258142422859824, 3], [36, 36, 0.7526716142145069, 3], [39, 32, 0.66547279516442404, 3], [42, 44, 0.71145146728421693, 12], [54, 44, 0.74225097191342349, 6], [60, 36, 0.76065395376109946, 3], [63, 32, 0.69434021707406701, 3], [66, 44, 0.68676987209868101, 6], [72, 44, 0.82924138864888386, 3], [75, 36, 0.7469230235286054, 3], [78, 32, 0.73692941019440417, 6], [84, 44, 0.78300250630480983, 3], [87, 44, 0.66405194935135425, 3], [90, 36, 0.71114255147077565, 12], [102, 32, 0.69561757437121152, 12], [114, 44, 0.66813139730411575, 3], [117, 44, 0.67463714728473911, 3], [120, 36, 0.89801347038888779, 6], [126, 32, 0.72780647419415945, 6]],
+[[0, 44, 0.99872898073921912, 6], [6, 36, 0.70955468279971834, 12], [18, 43, 0.70932770849134574, 12], [30, 44, 0.73489478138267916, 6], [36, 44, 0.79760261318745918, 12], [48, 36, 0.86135984589033876, 6], [54, 43, 0.67531785903613173, 6], [60, 44, 0.81223531046546027, 6], [66, 44, 0.74165335140927502, 6], [72, 36, 0.82208391373802214, 3], [75, 43, 0.72525515017970787, 3], [78, 44, 0.68603982928640017, 3], [81, 44, 0.67223493241481824, 3], [84, 36, 0.8693389723389312, 6], [90, 43, 0.72966353541581941, 6], [96, 44, 0.78405707320280715, 6], [102, 44, 0.67447814382927906, 12], [114, 36, 0.73771620599151466, 3], [117, 43, 0.68127796658528716, 3], [120, 44, 0.77050769204376157, 12], [132, 44, 0.77374471300709546, 3], [135, 36, 0.65310727178379824, 3], [138, 43, 0.73359712342091599, 6]],
+[[0, 48, 0.93667948675805324, 6], [6, 34, 0.69312388725983676, 6], [12, 26, 0.78427156945627485, 6], [18, 26, 0.69036600091538913, 12], [30, 48, 0.74346725730369312, 12], [42, 34, 0.65929381550375088, 12], [54, 26, 0.6542618006534362, 6], [60, 26, 0.77749657990634169, 12], [72, 48, 0.79215393064381501, 3], [75, 34, 0.65822459760487217, 3], [78, 26, 0.65111471584878733, 6], [84, 26, 0.83141917813722577, 3], [87, 48, 0.74501699336927341, 3], [90, 34, 0.70268959720463475, 12], [102, 26, 0.65195141495820497, 6], [108, 26, 0.83478360275588759, 6], [114, 48, 0.69216039135373952, 6], [120, 34, 0.75841712114634285, 3], [123, 26, 0.72448402452824279, 3], [126, 26, 0.72572126461724962, 6], [132, 48, 0.78941128326311072, 12], [144, 34, 0.77729691359549768, 3], [147, 26, 0.65271817371827645, 3], [150, 26, 0.71717795142674723, 6]],
+[[0, 41, 0.95792220847117671, 6], [6, 34, 0.65060515538861774, 6], [12, 48, 0.856167849374875, 12], [24, 36, 0.8507136899197002, 3], [27, 41, 0.66500849950509489, 3], [30, 34, 0.71247914502532406, 12], [42, 48, 0.73029700331220404, 12], [54, 36, 0.69607536606354969, 3], [57, 41, 0.69509468288190224, 3], [60, 34, 0.86888906072954131, 6], [66, 48, 0.72330841851795957, 12], [78, 36, 0.70406036089772139, 6], [84, 41, 0.7931257083499702, 6], [90, 34, 0.70401106287672977, 6], [96, 48, 0.77706690806155021, 3], [99, 36, 0.69558695745096766, 3], [102, 41, 0.66451997787113992, 3], [105, 34, 0.70111650277106563, 3], [108, 48, 0.8537898273397877, 6], [114, 36, 0.73944078463360496, 12], [126, 41, 0.65097358998155297, 6], [132, 34, 0.78625934669041686, 6], [138, 48, 0.68223077689473244, 6], [144, 36, 0.89064429237481102, 12], [156, 41, 0.82542761331590542, 6], [162, 34, 0.71792391354555563, 6]],
+[[0, 46, 0.90160199895320414, 12], [12, 46, 0.76839671026587919, 6], [18, 36, 0.67519842523621687, 6], [24, 36, 0.84133624952164332, 6], [30, 46, 0.73761239869475126, 12], [42, 46, 0.69767763116584758, 3], [45, 36, 0.65054670433808726, 3], [48, 36, 0.87848912920575306, 6], [54, 46, 0.70285472864346232, 6], [60, 46, 0.89628938390650859, 6], [66, 36, 0.72908990541401342, 6], [72, 36, 0.8880858802021695, 6], [78, 46, 0.71143815888680828, 12], [90, 46, 0.69414053110890017, 3], [93, 36, 0.7462887119942101, 3], [96, 36, 0.77011947516745349, 6], [102, 46, 0.71742720266138427, 3], [105, 46, 0.67708344196095205, 3], [108, 36, 0.78678536062299687, 12], [120, 36, 0.80333681526399303, 6], [126, 46, 0.74929259489173483, 12], [138, 46, 0.73169811668099072, 6], [144, 36, 0.895090857648148, 3], [147, 36, 0.73560880156045239, 3], [150, 46, 0.69944139448706943, 6], [156, 46, 0.87090669792688369, 3], [159, 36, 0.74916521862954222, 3], [162, 36, 0.70580957573629632, 6], [168, 46, 0.77447355863470491, 3], [171, 46, 0.71144556247757762, 3], [174, 36, 0.6737045979441485, 6]],
+[[0, 31, 0.94371327095067403, 6], [6, 24, 0.70407542874921913, 12], [18, 34, 0.73723518174297242, 12], [30, 29, 0.66098725469706188, 6], [36, 31, 0.88552823474198938, 6], [42, 24, 0.71915875647628613, 6], [48, 34, 0.81830848409040913, 3], [51, 29, 0.73260877360112298, 3], [54, 31, 0.65064975196536445, 3], [57, 24, 0.66306467354831533, 3], [60, 34, 0.76488045052910258, 6], [66, 29, 0.73716809316733045, 6], [72, 31, 0.86364744629431522, 6], [78, 24, 0.69451934651503988, 3], [81, 34, 0.67332022058418695, 3], [84, 29, 0.86156668627281807, 6], [90, 31, 0.65577512425246465, 6], [96, 24, 0.79739577988839316, 6], [102, 34, 0.70830764733420892, 6], [108, 29, 0.88987764908936273, 6], [114, 31, 0.68114712911936615, 12], [126, 24, 0.70715692786087259, 12], [138, 34, 0.71264444525678372, 6], [144, 29, 0.78891479284971511, 6], [150, 31, 0.6706549519175693, 6], [156, 24, 0.79964612725018513, 3], [159, 34, 0.73146776455900819, 3], [162, 29, 0.68017694142777652, 3], [165, 31, 0.71592794379192481, 3], [168, 24, 0.81340138643553883, 3], [171, 34, 0.6752449896019499, 3], [174, 29, 0.68712656173959719, 3], [177, 31, 0.73043134757110739, 3], [180, 24, 0.88709579038609165, 3], [183, 34, 0.69105241834098718, 3], [186, 29, 0.74633551326908698, 6]]],
+21: [[[0, 26, 0.9125333251105181, 6], [6, 41, 0.65390739347630444, 6], [12, 26, 0.87789896669984402, 6], [18, 26, 0.72917564298744697, 6]],
+[[0, 29, 0.96463220526363103, 6], [6, 29, 0.73680666252467264, 12], [18, 24, 0.72344819685359796, 6], [24, 44, 0.87167406927642266, 6], [30, 29, 0.66854163123467458, 6]],
+[[0, 29, 0.98099423123262985, 6], [6, 24, 0.65317195756749014, 6], [12, 31, 0.79324809118199024, 6], [18, 31, 0.74134636376433527, 6], [24, 29, 0.87318074292244541, 6], [30, 24, 0.72302948514227638, 6], [36, 31, 0.80099402720643587, 12]],
+[[0, 41, 0.92830895620274334, 6], [6, 24, 0.72324098999488751, 3], [9, 34, 0.68176541315799222, 3], [12, 24, 0.78583872386143738, 12], [24, 41, 0.79792975632675611, 6], [30, 24, 0.72549126817246945, 3], [33, 34, 0.72065313458326608, 3], [36, 24, 0.84591862721329725, 3], [39, 41, 0.72006471348861556, 3], [42, 24, 0.65587137933942408, 6], [48, 34, 0.86356923416280229, 6], [54, 24, 0.67625377500133321, 6]],
+[[0, 24, 0.92061194946642078, 6], [6, 43, 0.68083332705219779, 6], [12, 44, 0.79582491328879779, 6], [18, 44, 0.72537461713192897, 6], [24, 24, 0.78921877620341463, 12], [36, 43, 0.78397151943101973, 6], [42, 44, 0.73910890569872156, 6], [48, 44, 0.89360745588944446, 12], [60, 24, 0.8557109107677392, 3], [63, 43, 0.65781218158082055, 3], [66, 44, 0.6621865248781329, 6]],
+[[0, 24, 0.9803616031708039, 12], [12, 43, 0.76784426787299442, 6], [18, 43, 0.69235241050748086, 12], [30, 41, 0.65633192865831058, 3], [33, 24, 0.72507834211493205, 3], [36, 43, 0.89204268438245304, 6], [42, 43, 0.65221013624644353, 6], [48, 41, 0.76647636536571762, 6], [54, 24, 0.65372340633143966, 6], [60, 43, 0.79255740844304012, 6], [66, 43, 0.72134804888889881, 3], [69, 41, 0.68877657997752617, 3], [72, 24, 0.89361066954413348, 6], [78, 43, 0.66146779733803518, 6]],
+[[0, 43, 0.96310501695118578, 3], [3, 43, 0.74401776465870573, 3], [6, 43, 0.67572988245924881, 3], [9, 43, 0.67441662191264673, 3], [12, 43, 0.76155916634423249, 3], [15, 43, 0.73668593521968107, 3], [18, 43, 0.6667820297470648, 6], [24, 43, 0.88455296595619448, 12], [36, 43, 0.80514080856792469, 6], [42, 43, 0.68494468990114954, 6], [48, 43, 0.85470663768525623, 3], [51, 43, 0.7475529120791915, 3], [54, 43, 0.72731362099881669, 3], [57, 43, 0.7443990109256039, 3], [60, 43, 0.77135268406552537, 3], [63, 43, 0.68355460984733163, 3], [66, 43, 0.71832636249885784, 6], [72, 43, 0.80698122054901122, 12], [84, 43, 0.85596485591898541, 3], [87, 43, 0.66601996297831667, 3], [90, 43, 0.74896104782355866, 6]],
+[[0, 43, 0.95964818681503283, 3], [3, 32, 0.71233592522894917, 3], [6, 24, 0.74644250123211042, 6], [12, 36, 0.75444162692193928, 3], [15, 43, 0.7302344681438474, 3], [18, 32, 0.70488125661182566, 3], [21, 24, 0.74821270394913619, 3], [24, 36, 0.85339489750798669, 12], [36, 43, 0.82986978466140504, 12], [48, 32, 0.7933058643305152, 3], [51, 24, 0.65986540561176732, 3], [54, 36, 0.71147410854717497, 6], [60, 43, 0.7620853512051613, 6], [66, 32, 0.74785527580280453, 6], [72, 24, 0.75187053344505383, 6], [78, 36, 0.69544835378863423, 6], [84, 43, 0.88477468525308289, 6], [90, 32, 0.71601667604962027, 3], [93, 24, 0.67088994622161624, 3], [96, 36, 0.86485163358127692, 6], [102, 43, 0.73923028088142773, 6]],
+[[0, 34, 0.95080629382409165, 6], [6, 29, 0.74951403335844224, 12], [18, 48, 0.69968642644664147, 6], [24, 36, 0.81934067181511971, 12], [36, 34, 0.77652920408421255, 6], [42, 29, 0.73514135622601651, 6], [48, 48, 0.89717507528474216, 12], [60, 36, 0.86864471046516933, 6], [66, 34, 0.7095986437083861, 12], [78, 29, 0.74738843122547804, 6], [84, 48, 0.75324300358623852, 12], [96, 36, 0.76835561747696812, 3], [99, 34, 0.7079612393326099, 3], [102, 29, 0.67615155995723375, 3], [105, 48, 0.69108999600717258, 3], [108, 36, 0.7571644306762384, 3], [111, 34, 0.71773960928004632, 3], [114, 29, 0.71426068845301327, 6]],
+[[0, 48, 0.91262844393203968, 6], [6, 29, 0.66446450011004721, 3], [9, 34, 0.67829162705675461, 3], [12, 24, 0.84295038923855725, 12], [24, 48, 0.75690726441120715, 6], [30, 29, 0.65301891441298465, 12], [42, 34, 0.67972238856594569, 3], [45, 24, 0.72106169705418244, 3], [48, 48, 0.86551467711552843, 6], [54, 29, 0.71516789206244591, 3], [57, 34, 0.69911686504443449, 3], [60, 24, 0.76770254660193948, 6], [66, 48, 0.70499854394928885, 6], [72, 29, 0.81429859396518811, 6], [78, 34, 0.73691244850731552, 12], [90, 24, 0.71240193645182837, 12], [102, 48, 0.70137001652661435, 3], [105, 29, 0.65402276160281236, 3], [108, 34, 0.82573159305557631, 12], [120, 24, 0.82238484359645925, 6], [126, 48, 0.7274672992435125, 6]],
+[[0, 43, 0.99943542026186449, 6], [6, 26, 0.67922017177522043, 12], [18, 24, 0.67203199056640195, 3], [21, 32, 0.74933413563505902, 3], [24, 43, 0.80309331374929693, 3], [27, 26, 0.71937952242351733, 3], [30, 24, 0.70597829422659353, 12], [42, 32, 0.6796295302866574, 3], [45, 43, 0.69451787775714546, 3], [48, 26, 0.88897887349817628, 3], [51, 24, 0.74413634859510802, 3], [54, 32, 0.6504734723624328, 12], [66, 43, 0.66016614206283719, 12], [78, 26, 0.71408641772054526, 3], [81, 24, 0.69679647027408764, 3], [84, 32, 0.89413217261081335, 6], [90, 43, 0.72023816587502598, 6], [96, 26, 0.84639835352908976, 6], [102, 24, 0.69333054269537819, 12], [114, 32, 0.70959550189549558, 6], [120, 43, 0.77953747438278875, 6], [126, 26, 0.65712807098546167, 6], [132, 24, 0.75511591234053854, 12]],
+[[0, 44, 0.90468777996244998, 6], [6, 46, 0.68165535389960097, 3], [9, 41, 0.67551866606254507, 3], [12, 41, 0.78649491997425591, 3], [15, 44, 0.70060452044060084, 3], [18, 46, 0.68048994697794518, 6], [24, 41, 0.89291397019725782, 6], [30, 41, 0.71697796712758199, 12], [42, 44, 0.6573481387442992, 12], [54, 46, 0.7493425871193643, 6], [60, 41, 0.87772075365730129, 6], [66, 41, 0.69858095950932797, 6], [72, 44, 0.79633729826194799, 12], [84, 46, 0.84409930644142683, 6], [90, 41, 0.66175709661673709, 6], [96, 41, 0.76359136862022425, 6], [102, 44, 0.72148896110094041, 6], [108, 46, 0.76836241447044595, 6], [114, 41, 0.73619585308366986, 12], [126, 41, 0.65827540267483131, 12], [138, 44, 0.72482275391711826, 12], [150, 46, 0.69354897082855449, 6]],
+[[0, 48, 0.94739675683296254, 6], [6, 36, 0.69179984093839375, 6], [12, 46, 0.82581156204204054, 3], [15, 46, 0.70465367079506647, 3], [18, 48, 0.6679348135485772, 6], [24, 36, 0.82487168897492669, 6], [30, 46, 0.66738659878104745, 6], [36, 46, 0.86460880662837225, 6], [42, 48, 0.68695347282762209, 3], [45, 36, 0.66583665120910618, 3], [48, 46, 0.87279600693734793, 6], [54, 46, 0.74308966065811677, 6], [60, 48, 0.87519936376406715, 6], [66, 36, 0.66755570592766522, 6], [72, 46, 0.89559431276770551, 6], [78, 46, 0.69084590582489835, 3], [81, 48, 0.73736697550549846, 3], [84, 36, 0.85277350192646184, 6], [90, 46, 0.73182047909075476, 6], [96, 46, 0.80972314380301569, 6], [102, 48, 0.69973426159444996, 6], [108, 36, 0.86622829021896919, 3], [111, 46, 0.65412863683661326, 3], [114, 46, 0.67288040513315839, 6], [120, 48, 0.81723733329998771, 6], [126, 36, 0.6681911257670784, 3], [129, 46, 0.71033043528681683, 3], [132, 46, 0.76088222014492779, 6], [138, 48, 0.68899762102838114, 6], [144, 36, 0.80235366609554237, 3], [147, 46, 0.67668924216456261, 3], [150, 46, 0.67870910013387387, 3], [153, 48, 0.6644788829526852, 3], [156, 36, 0.79754637365476777, 3], [159, 46, 0.70860084582226757, 3], [162, 46, 0.69832568403745543, 6]],
+[[0, 44, 0.98858433253383238, 12], [12, 36, 0.75648899130256975, 3], [15, 46, 0.70053249288479991, 3], [18, 48, 0.68809356161706248, 3], [21, 44, 0.72146323065653939, 3], [24, 36, 0.89140975909633835, 3], [27, 46, 0.72617325446490155, 3], [30, 48, 0.72053509056859399, 12], [42, 44, 0.73524270370739297, 6], [48, 36, 0.80144260938431489, 6], [54, 46, 0.72000012762446675, 3], [57, 48, 0.69026843353344036, 3], [60, 44, 0.82816321896956469, 3], [63, 36, 0.71843677842978004, 3], [66, 46, 0.69246872664179582, 6], [72, 48, 0.84570755281938981, 3], [75, 44, 0.66887838165670088, 3], [78, 36, 0.67873076987891823, 6], [84, 46, 0.83382261284059012, 12], [96, 48, 0.88280430106387908, 6], [102, 44, 0.68946575920592501, 6], [108, 36, 0.7948468342077194, 6], [114, 46, 0.69592025376919142, 6], [120, 48, 0.88039375735006209, 12], [132, 44, 0.82437516958088208, 3], [135, 36, 0.70757279440864074, 3], [138, 46, 0.72668828994318169, 6], [144, 48, 0.82918321114344429, 3], [147, 44, 0.7138062068301585, 3], [150, 36, 0.74199239983869469, 12], [162, 46, 0.65819398964404408, 3], [165, 48, 0.66605946224537071, 3], [168, 44, 0.88431474311298841, 6], [174, 36, 0.70378567260134839, 6]],
+[[0, 46, 0.92142031054221019, 6], [6, 46, 0.70478779789370327, 6], [12, 32, 0.83729834725514596, 6], [18, 44, 0.66973820327677902, 3], [21, 46, 0.68607804791459459, 3], [24, 46, 0.81910449963619036, 3], [27, 32, 0.70425140180150558, 3], [30, 44, 0.74594272452133681, 12], [42, 46, 0.71248862657028, 6], [48, 46, 0.85726377375904439, 6], [54, 32, 0.66665727392386198, 6], [60, 44, 0.805559895383261, 6], [66, 46, 0.67057262820180596, 6], [72, 46, 0.78104212251186578, 6], [78, 32, 0.71768378078700046, 6], [84, 44, 0.87509712501104642, 3], [87, 46, 0.65389449297722768, 3], [90, 46, 0.69765475708775448, 6], [96, 32, 0.85905086580082046, 6], [102, 44, 0.69339482211970682, 6], [108, 46, 0.75167016995860414, 12], [120, 46, 0.7808256804128213, 3], [123, 32, 0.71305419749945753, 3], [126, 44, 0.6753485608766987, 6], [132, 46, 0.81117728365299169, 6], [138, 46, 0.66364938100201376, 3], [141, 32, 0.70478860468321247, 3], [144, 44, 0.79543457012257668, 3], [147, 46, 0.74956585104346096, 3], [150, 46, 0.70096179457305352, 6], [156, 32, 0.796987037796002, 3], [159, 44, 0.72903407136030673, 3], [162, 46, 0.66888673579790092, 6], [168, 46, 0.85153988588164597, 12], [180, 32, 0.83947905532115141, 6], [186, 44, 0.68609484698949164, 6]]],
+32: [[[0, 38, 0.95624260623319235, 6], [6, 48, 0.71743954734270088, 18]],
+[[0, 29, 0.97627467325369621, 6], [6, 29, 0.74326314626179124, 6], [12, 29, 0.77296963553708675, 6], [18, 24, 0.70343920954653494, 6], [24, 36, 0.75090854753173042, 12]],
+[[0, 43, 0.92980250637131268, 12], [12, 46, 0.85461335380708781, 6], [18, 36, 0.69341910507204674, 12], [30, 24, 0.66564724409758724, 6], [36, 31, 0.85911463641628516, 6], [42, 43, 0.6503667584931806, 6]],
+[[0, 36, 0.97213806120505686, 6], [6, 43, 0.66557059825812215, 6], [12, 24, 0.81345008340552538, 6], [18, 24, 0.65919123215914799, 6], [24, 43, 0.79361138276848964, 18], [42, 36, 0.72344022935435981, 6], [48, 43, 0.87631797100207354, 6], [54, 24, 0.662286526651789, 6]],
+[[0, 31, 0.94429667670621553, 12], [12, 32, 0.82702239832716118, 12], [24, 31, 0.88122964884193533, 12], [36, 29, 0.88932296431988034, 18], [54, 38, 0.70410300008531435, 6], [60, 31, 0.85063340218051198, 12]],
+[[0, 29, 0.91120602487385305, 6], [6, 36, 0.73428056560128407, 6], [12, 32, 0.89674271846730269, 18], [30, 24, 0.73375397793953367, 12], [42, 26, 0.74518678290128149, 18], [60, 29, 0.83533701461135179, 6], [66, 36, 0.74910636573297051, 12], [78, 32, 0.73123245653062197, 6]],
+[[0, 44, 0.91726800902118988, 6], [6, 26, 0.7381462328738585, 12], [18, 26, 0.6743043057263457, 6], [24, 24, 0.8393998691765554, 6], [30, 36, 0.71089197464248788, 6], [36, 44, 0.86614340112608068, 6], [42, 26, 0.69103452091113071, 6], [48, 26, 0.82078818512819218, 12], [60, 24, 0.89007673892983097, 18], [78, 36, 0.65971829816405192, 6], [84, 44, 0.88823757539494541, 12]],
+[[0, 24, 0.94873497427266429, 12], [12, 26, 0.79313446421011058, 12], [24, 26, 0.79121707668391061, 12], [36, 36, 0.79276201802418444, 6], [42, 36, 0.71750887024724053, 6], [48, 24, 0.7638473063538529, 6], [54, 26, 0.70303959102950608, 6], [60, 26, 0.88234760806168688, 18], [78, 36, 0.7491413725293089, 18], [96, 36, 0.86606783371537999, 6], [102, 24, 0.73758496511387328, 6]],
+[[0, 32, 0.9344846156732356, 6], [6, 29, 0.69943546095481568, 12], [18, 24, 0.65268600378567576, 12], [30, 43, 0.67494490384745098, 12], [42, 48, 0.72773520955505666, 6], [48, 32, 0.78085557478109435, 18], [66, 29, 0.72590392551517158, 18], [84, 24, 0.79868184909070972, 6], [90, 43, 0.67417368271206213, 6], [96, 48, 0.77806249270300687, 6], [102, 32, 0.72484075785765434, 12], [114, 29, 0.68258525019378991, 6]],
+[[0, 26, 0.93237429231469426, 6], [6, 26, 0.69966393895721501, 18], [24, 24, 0.79197110233541024, 12], [36, 41, 0.87488333190835987, 18], [54, 36, 0.67531245787409588, 6], [60, 26, 0.77106035096433123, 6], [66, 26, 0.68339896120180643, 18], [84, 24, 0.86875437233489561, 18], [102, 41, 0.72457216505662292, 6], [108, 36, 0.88247068190445432, 6], [114, 26, 0.71976246138768851, 6], [120, 26, 0.76566629738256708, 6], [126, 24, 0.74262802711698861, 6]],
+[[0, 36, 0.93194503327303058, 6], [6, 41, 0.65255206722257098, 12], [18, 26, 0.66454916752309301, 6], [24, 26, 0.88537916270412753, 18], [42, 26, 0.65113078620581588, 12], [54, 36, 0.67991386398651765, 6], [60, 41, 0.86334292465548801, 12], [72, 26, 0.85751482074959007, 12], [84, 26, 0.75698400898633278, 18], [102, 26, 0.7486689475829722, 6], [108, 36, 0.82173764104089231, 12], [120, 41, 0.87707242452173706, 18], [138, 26, 0.68013210739196639, 6]],
+[[0, 26, 0.95583592657749417, 12], [12, 46, 0.78979855277055211, 12], [24, 48, 0.84463511986996065, 6], [30, 32, 0.73264893278430621, 6], [36, 41, 0.78779936381990778, 6], [42, 26, 0.74025923505033175, 6], [48, 46, 0.82902699810028735, 12], [60, 48, 0.81722411075977219, 18], [78, 32, 0.68957311041375502, 6], [84, 41, 0.82931474568967289, 6], [90, 26, 0.66851510436396311, 6], [96, 46, 0.77701393011124897, 12], [108, 48, 0.87021552357223397, 12], [120, 32, 0.77386490773473182, 6], [126, 41, 0.73985018415391401, 12], [138, 26, 0.74651508179226689, 6], [144, 46, 0.79548654019890741, 12]],
+[[0, 38, 0.99899825400885844, 12], [12, 29, 0.82562503107812291, 6], [18, 32, 0.74133550940954474, 6], [24, 31, 0.80213981008863322, 12], [36, 26, 0.85278989289166662, 18], [54, 38, 0.68254832503680363, 6], [60, 29, 0.84272040750438215, 6], [66, 32, 0.6745059648634274, 6], [72, 31, 0.81164616099789144, 18], [90, 26, 0.67695508679775851, 12], [102, 38, 0.7183648708319661, 6], [108, 29, 0.7808744904456989, 12], [120, 32, 0.85032315655769752, 6], [126, 31, 0.74840054219675722, 12], [138, 26, 0.69807642198956787, 12], [150, 38, 0.74062397777901801, 6], [156, 29, 0.89025755050286093, 12]],
+[[0, 24, 0.92867306635200841, 18], [18, 24, 0.70719187935365124, 6], [24, 26, 0.88654361290954808, 12], [36, 26, 0.75201106416785302, 6], [42, 26, 0.69347997718156495, 6], [48, 24, 0.84941010310830922, 6], [54, 24, 0.66195554344133456, 6], [60, 26, 0.85913332153051469, 12], [72, 26, 0.79174142342961462, 18], [90, 26, 0.74345549372486719, 12], [102, 24, 0.70549365480295534, 12], [114, 24, 0.74758965766703334, 6], [120, 26, 0.80732721913152938, 18], [138, 26, 0.65768998301773873, 6], [144, 26, 0.82407232597436231, 6], [150, 24, 0.73335116772080178, 6], [156, 24, 0.8745369616137515, 6], [162, 26, 0.68975803519214385, 12], [174, 26, 0.72364331234335533, 6]],
+[[0, 32, 0.94451711389049109, 6], [6, 46, 0.65390420276306094, 12], [18, 31, 0.68331552046098065, 6], [24, 26, 0.87012505266641826, 12], [36, 43, 0.89737377809948871, 6], [42, 32, 0.66043290890699291, 12], [54, 46, 0.67692630714767565, 12], [66, 31, 0.73991603766231917, 18], [84, 26, 0.87560992991972797, 18], [102, 43, 0.71263250813917589, 18], [120, 32, 0.78567554018619656, 6], [126, 46, 0.72072646666358686, 6], [132, 31, 0.89095681839176011, 18], [150, 26, 0.6688085460115254, 6], [156, 43, 0.77379310698571879, 18], [174, 32, 0.66495647086856069, 6], [180, 46, 0.81026746299408992, 6], [186, 31, 0.65070036765006956, 6]]],
+33: [[[0, 46, 0.9771698449965569, 6], [6, 24, 0.70657893816302419, 6], [12, 24, 0.87146738729949413, 12]],
+[[0, 31, 0.94473968743845893, 12], [12, 38, 0.83763796711808558, 6], [18, 24, 0.74789297440145275, 12], [30, 31, 0.68137270565958707, 6]],
+[[0, 26, 0.91941210550478025, 6], [6, 43, 0.71909920951626083, 6], [12, 31, 0.84670362396737309, 12], [24, 38, 0.8610785017549778, 6], [30, 24, 0.7007573728056411, 12], [42, 26, 0.68601231986481348, 6]],
+[[0, 32, 0.91817561554188576, 12], [12, 29, 0.88974524769201868, 12], [24, 38, 0.84146532126019391, 6], [30, 46, 0.65842776130703307, 6], [36, 46, 0.80626525511475133, 12], [48, 32, 0.7791265135371569, 12]],
+[[0, 46, 0.9311023460533876, 6], [6, 29, 0.74572933762350124, 6], [12, 26, 0.7803091993516349, 6], [18, 32, 0.65974607888161019, 6], [24, 24, 0.83331274268307531, 6], [30, 46, 0.71402128505435036, 12], [42, 29, 0.73092642474924818, 18], [60, 26, 0.88040897453813505, 12]],
+[[0, 43, 0.93699558967693097, 18], [18, 24, 0.73583894530849747, 6], [24, 46, 0.83332386902205646, 6], [30, 46, 0.71565162984625841, 18], [48, 24, 0.79584956534961337, 6], [54, 43, 0.72111883792834375, 18], [72, 24, 0.76371127867485666, 12]],
+[[0, 31, 0.90544047407107531, 12], [12, 36, 0.83017321747576034, 12], [24, 36, 0.77802192670995429, 18], [42, 32, 0.69723306155680065, 6], [48, 32, 0.83925138037880953, 12], [60, 31, 0.87036749709309802, 6], [66, 36, 0.68635587538426612, 6], [72, 36, 0.83800349569179744, 12], [84, 32, 0.82917425431820935, 12]],
+[[0, 36, 0.97568253648414727, 6], [6, 24, 0.67411201407390975, 12], [18, 26, 0.73175511353294065, 6], [24, 24, 0.86963559481135877, 12], [36, 24, 0.75647286403450342, 12], [48, 36, 0.81880316766049099, 18], [66, 24, 0.71684525273879829, 6], [72, 26, 0.89954820953376602, 6], [78, 24, 0.68356713701056038, 12], [90, 24, 0.70516107023358887, 12], [102, 36, 0.65035181363787664, 6]],
+[[0, 24, 0.98219154396083319, 18], [18, 36, 0.73982024058097773, 12], [30, 32, 0.6888540688749345, 6], [36, 29, 0.85616582414241327, 12], [48, 24, 0.81924566409378086, 12], [60, 24, 0.83321468991051695, 6], [66, 36, 0.74160315709890368, 12], [78, 32, 0.71483136541781933, 12], [90, 29, 0.74809876058587288, 12], [102, 24, 0.7328752871149451, 12], [114, 24, 0.71033148888213515, 6]],
+[[0, 24, 0.93454293393077581, 12], [12, 34, 0.81323745913534573, 6], [18, 29, 0.65408202919440661, 12], [30, 29, 0.72775833012592162, 12], [42, 36, 0.67480972654910665, 12], [54, 24, 0.705548195013737, 12], [66, 34, 0.74587853156499284, 6], [72, 29, 0.78680714134685903, 6], [78, 29, 0.74203544140035682, 12], [90, 36, 0.73100302125322825, 6], [96, 24, 0.77649851335305253, 6], [102, 34, 0.65984816608814534, 6], [108, 29, 0.86968835589937399, 12], [120, 29, 0.84938666815562269, 12]],
+[[0, 29, 0.98589611881660222, 12], [12, 26, 0.77877720211796375, 12], [24, 26, 0.86374207596813268, 6], [30, 24, 0.74616503791526911, 12], [42, 29, 0.72607158807187011, 6], [48, 29, 0.86083511767480303, 12], [60, 26, 0.82679032236096806, 6], [66, 26, 0.66653580680310076, 12], [78, 24, 0.7246400669286327, 18], [96, 29, 0.84153068073805426, 6], [102, 29, 0.68990149044044313, 6], [108, 26, 0.81842571490364202, 6], [114, 26, 0.72938540271269148, 18], [132, 24, 0.87651860560723427, 12]],
+[[0, 26, 0.9871764005254906, 12], [12, 46, 0.78184433122579788, 12], [24, 46, 0.87052123094156109, 6], [30, 46, 0.65730994193934689, 6], [36, 41, 0.82875808185392386, 6], [42, 26, 0.69808677597371582, 6], [48, 46, 0.83442350050600511, 12], [60, 46, 0.79645571362463874, 12], [72, 46, 0.8846691543712486, 6], [78, 41, 0.74640743177031776, 6], [84, 26, 0.79295625013115512, 6], [90, 46, 0.67488031191907893, 12], [102, 46, 0.65427375529906795, 12], [114, 46, 0.74852067214139129, 12], [126, 41, 0.72364188735303681, 12], [138, 26, 0.71527034251704225, 18]],
+[[0, 48, 0.91560328131582536, 12], [12, 31, 0.79503922677596339, 6], [18, 38, 0.67968227382264801, 6], [24, 36, 0.78352013925710984, 6], [30, 48, 0.73291685178616062, 12], [42, 48, 0.72999088214229402, 6], [48, 31, 0.83222583236052006, 12], [60, 38, 0.81865153638982946, 6], [66, 36, 0.74249917745727245, 12], [78, 48, 0.65059289248322494, 6], [84, 48, 0.77961096342442804, 6], [90, 31, 0.73148020629236132, 6], [96, 38, 0.8371408769977795, 12], [108, 36, 0.75446466794143729, 6], [114, 48, 0.72409972164819147, 18], [132, 48, 0.8375624702261516, 12], [144, 31, 0.80927614386188773, 18], [162, 38, 0.73863289714088554, 6]],
+[[0, 36, 0.92653016861953719, 6], [6, 38, 0.74211995273385689, 6], [12, 38, 0.76608687383270546, 18], [30, 41, 0.65710823906022098, 12], [42, 26, 0.67435326215976454, 6], [48, 36, 0.75331722249649169, 12], [60, 38, 0.79849596058701866, 6], [66, 38, 0.72959502920772312, 12], [78, 41, 0.69181450599309324, 6], [84, 26, 0.82037972811115767, 12], [96, 36, 0.80281827793985738, 12], [108, 38, 0.87586583272239538, 6], [114, 38, 0.72383741289067549, 12], [126, 41, 0.68978690800325992, 6], [132, 26, 0.89719999773018611, 12], [144, 36, 0.78924309576976215, 18], [162, 38, 0.66717951913220452, 6], [168, 38, 0.89027497298371305, 6], [174, 41, 0.66190932146625581, 6]],
+[[0, 48, 0.948894180694422, 12], [12, 34, 0.78235836718021023, 6], [18, 34, 0.66803197878059783, 12], [30, 32, 0.67789538109178971, 6], [36, 32, 0.87783023561170526, 6], [42, 48, 0.66891325737677443, 12], [54, 34, 0.67097769367841298, 12], [66, 34, 0.73988179413004429, 6], [72, 32, 0.84103407105835126, 6], [78, 32, 0.70623663666631131, 12], [90, 48, 0.65996904098901188, 6], [96, 34, 0.76130246771325183, 12], [108, 34, 0.88806606911117714, 12], [120, 32, 0.80076137304196304, 6], [126, 32, 0.69413574748412821, 18], [144, 48, 0.8966623242255316, 6], [150, 34, 0.6887535223053538, 12], [162, 34, 0.66522384724169947, 12], [174, 32, 0.7078060862975516, 12], [186, 32, 0.72248784927601761, 6]]],
+34: [[[0, 48, 0.9113695906873277, 18], [18, 43, 0.65056339439169009, 6]],
+[[0, 34, 0.97038562664649408, 18], [18, 31, 0.65273681696677921, 18]],
+[[0, 36, 0.94631108191589619, 12], [12, 34, 0.85721367837519968, 12], [24, 24, 0.8146544090298089, 6], [30, 24, 0.69893183741397513, 6], [36, 26, 0.86723185065980213, 12]],
+[[0, 41, 0.92741804428879315, 12], [12, 36, 0.82675779236788538, 18], [30, 29, 0.65946767992160271, 18], [48, 26, 0.89298608418281866, 12]],
+[[0, 48, 0.94434078297502799, 6], [6, 36, 0.72639867581164885, 18], [24, 36, 0.8048119938671503, 12], [36, 48, 0.83941670701803595, 12], [48, 36, 0.80215038363904256, 6], [54, 26, 0.74583241608000783, 6], [60, 48, 0.81406543411323384, 12]],
+[[0, 34, 0.90515196402378939, 6], [6, 31, 0.71573571447430462, 6], [12, 24, 0.7560558762350772, 12], [24, 48, 0.86228912254139811, 6], [30, 29, 0.74419336783499113, 6], [36, 29, 0.77798470909992812, 6], [42, 34, 0.70935619803802741, 12], [54, 31, 0.73743248384438731, 18], [72, 24, 0.8202254367092936, 12]],
+[[0, 41, 0.95087510442490109, 12], [12, 24, 0.83510901090963718, 12], [24, 29, 0.88615365680799352, 18], [42, 24, 0.72418747272685624, 12], [54, 32, 0.69081292599869848, 6], [60, 38, 0.75265873091250113, 12], [72, 41, 0.83611959659456381, 6], [78, 24, 0.67359456667708018, 6], [84, 29, 0.83356937919971263, 6], [90, 24, 0.67087597221917683, 6]],
+[[0, 32, 0.96162344795845744, 6], [6, 32, 0.65257234500245997, 12], [18, 26, 0.67607946320281176, 12], [30, 26, 0.70241547120601355, 12], [42, 26, 0.72366501154650231, 18], [60, 26, 0.82864094951580569, 12], [72, 32, 0.81873166574754686, 12], [84, 32, 0.79208964409290594, 12], [96, 26, 0.81380287105594917, 12]],
+[[0, 36, 0.96080317491357348, 12], [12, 24, 0.79131904133096531, 6], [18, 43, 0.74902665426777448, 18], [36, 44, 0.77130598738245848, 12], [48, 29, 0.84928461104462072, 12], [60, 36, 0.76388269271792242, 12], [72, 36, 0.77630483596737065, 6], [78, 24, 0.73306229876229201, 12], [90, 43, 0.71079060067913591, 6], [96, 44, 0.82935724973236524, 6], [102, 29, 0.71641808498480919, 12], [114, 36, 0.7143170395525118, 6]],
+[[0, 44, 0.98597434722388799, 18], [18, 46, 0.65858027213153247, 12], [30, 29, 0.70879168403946047, 18], [48, 26, 0.8128671142176791, 12], [60, 46, 0.76638330497369478, 18], [78, 29, 0.74668719647953607, 12], [90, 44, 0.70550877945470281, 18], [108, 46, 0.88778443162767751, 12], [120, 29, 0.75487181923819668, 6], [126, 26, 0.69055559565625957, 6]],
+[[0, 34, 0.92965924591700067, 12], [12, 43, 0.84952965566839778, 18], [30, 44, 0.66745432238674163, 18], [48, 38, 0.75416395673794234, 18], [66, 24, 0.7142074589016616, 18], [84, 31, 0.81339596197418873, 6], [90, 34, 0.74299381449734214, 12], [102, 43, 0.65396558960724738, 12], [114, 44, 0.708766335849633, 12], [126, 38, 0.70934736516108055, 12], [138, 24, 0.74864341696564551, 6]],
+[[0, 36, 0.93971056894407701, 6], [6, 43, 0.74883428225178128, 12], [18, 46, 0.73040263901533886, 12], [30, 36, 0.71976575780587848, 12], [42, 43, 0.68445590620645869, 12], [54, 46, 0.74934139906152919, 12], [66, 36, 0.67176184644540882, 6], [72, 43, 0.77777474259604462, 18], [90, 46, 0.69040270203889131, 6], [96, 36, 0.79049247968979286, 18], [114, 43, 0.67594874526704796, 12], [126, 46, 0.66362654648442243, 18], [144, 36, 0.89034954844173475, 12]],
+[[0, 34, 0.95705850658737235, 12], [12, 24, 0.832891349012715, 12], [24, 44, 0.80976062091503065, 12], [36, 44, 0.78196280681301666, 12], [48, 43, 0.78821020836531452, 18], [66, 29, 0.70650292335109111, 6], [72, 34, 0.85485951987335396, 12], [84, 24, 0.78160052360577459, 6], [90, 44, 0.71171185856026831, 18], [108, 44, 0.75611145215160558, 6], [114, 43, 0.70135385012290541, 12], [126, 29, 0.69877973879561528, 18], [144, 34, 0.87879810281445681, 12], [156, 24, 0.84937061727450613, 12]],
+[[0, 26, 0.93638675322742571, 6], [6, 26, 0.69775136776081148, 6], [12, 44, 0.83251900087139064, 6], [18, 41, 0.74388233891708699, 18], [36, 41, 0.87651184056698828, 12], [48, 36, 0.84526846528532518, 12], [60, 26, 0.77795763366080639, 18], [78, 26, 0.72567013565137994, 12], [90, 44, 0.66458829667504271, 18], [108, 41, 0.78651003135056941, 12], [120, 41, 0.76735897727600788, 18], [138, 36, 0.66340508942444509, 18], [156, 26, 0.77365383460046777, 6], [162, 26, 0.73774143029374195, 6], [168, 44, 0.83036171075783316, 12]],
+[[0, 44, 0.90241624029280987, 6], [6, 46, 0.70539776336238957, 12], [18, 36, 0.71794011451898965, 12], [30, 32, 0.65887633517919486, 6], [36, 38, 0.8583171159443066, 12], [48, 46, 0.78476913563433937, 12], [60, 44, 0.89368548452197527, 18], [78, 46, 0.68260105851743169, 12], [90, 36, 0.67100689089334287, 12], [102, 32, 0.69727368573224002, 12], [114, 38, 0.69710674566326358, 12], [126, 46, 0.67988731478945952, 12], [138, 44, 0.70645997739451372, 12], [150, 46, 0.70122329731082145, 18], [168, 36, 0.88481047370382759, 12], [180, 32, 0.85264811264663254, 12]]],
+35: [[[0, 43, 0.95630806720929595, 12], [12, 44, 0.87141587274047261, 12]],
+[[0, 34, 0.91928951281434534, 18], [18, 29, 0.70364678420830162, 6], [24, 34, 0.89560430230836086, 6], [30, 36, 0.71140704310858582, 6]],
+[[0, 31, 0.94465780727662807, 12], [12, 38, 0.89476715812674901, 24], [36, 36, 0.83812807524373656, 12]],
+[[0, 46, 0.9539187155473392, 12], [12, 48, 0.77639979512237267, 12], [24, 32, 0.78715386837831047, 24], [48, 32, 0.75257677751217655, 12]],
+[[0, 44, 0.93064759498871386, 24], [24, 44, 0.89407302737123495, 6], [30, 34, 0.6586249998238799, 24], [54, 24, 0.74634517957655477, 18]],
+[[0, 36, 0.98264071117189944, 6], [6, 44, 0.70817379974601835, 12], [18, 44, 0.73066339308815587, 12], [30, 26, 0.66346326195091831, 12], [42, 26, 0.71351358180503899, 18], [60, 24, 0.85237420447917733, 18], [78, 36, 0.74679096442239001, 6]],
+[[0, 26, 0.98084180754706796, 24], [24, 41, 0.79548895958025212, 18], [42, 26, 0.70234016317353254, 18], [60, 24, 0.8874807259612576, 12], [72, 24, 0.89558709497581412, 12], [84, 29, 0.85846397396344276, 12]],
+[[0, 48, 0.95808061392193078, 12], [12, 29, 0.79567837673678099, 12], [24, 36, 0.76769444698533185, 18], [42, 38, 0.71798159119533089, 12], [54, 36, 0.66821340001224472, 18], [72, 34, 0.7987074318109969, 18], [90, 48, 0.74004286555115739, 18]],
+[[0, 36, 0.93176834964088218, 18], [18, 43, 0.65315555152150295, 12], [30, 46, 0.72483039806713412, 12], [42, 48, 0.71303040048106636, 18], [60, 31, 0.79018843024327889, 18], [78, 29, 0.67202398603153346, 18], [96, 36, 0.82098968479411705, 18], [114, 43, 0.65266556381270191, 6]],
+[[0, 24, 0.95137912779447953, 6], [6, 24, 0.66742122604210974, 12], [18, 34, 0.73079414031582246, 24], [42, 24, 0.73737110552447904, 18], [60, 41, 0.79324508811315542, 12], [72, 36, 0.76051142371529434, 24], [96, 24, 0.89431146052142174, 18], [114, 24, 0.74712120245718527, 12], [126, 34, 0.71047155674477969, 6]],
+[[0, 38, 0.94140723033413853, 12], [12, 36, 0.84185786959241837, 12], [24, 36, 0.87801818228263784, 12], [36, 48, 0.89070626849920198, 12], [48, 46, 0.87944064369033725, 6], [54, 24, 0.71960004496644803, 12], [66, 38, 0.6790838654535053, 24], [90, 36, 0.71104636760625317, 12], [102, 36, 0.70180636076818792, 6], [108, 48, 0.85785775029702283, 24], [132, 46, 0.77785447319961853, 12]],
+[[0, 31, 0.99189411569703057, 12], [12, 38, 0.83001504115504399, 18], [30, 36, 0.74404157477514354, 12], [42, 24, 0.67283423256633601, 18], [60, 36, 0.89861065991754807, 12], [72, 38, 0.88314586497155656, 12], [84, 31, 0.85086709279339956, 18], [102, 38, 0.73920864301071754, 18], [120, 36, 0.87262426224370149, 12], [132, 24, 0.79322737058623005, 12], [144, 36, 0.87787191342437565, 12]],
+[[0, 31, 0.99396717868234918, 24], [24, 36, 0.82649144686186116, 12], [36, 36, 0.84636520526586911, 18], [54, 36, 0.73374468087494071, 18], [72, 26, 0.89294833927686368, 24], [96, 43, 0.81330904866414855, 12], [108, 31, 0.8528385967850004, 6], [114, 36, 0.67353234426652864, 24], [138, 36, 0.70915350881533679, 18], [156, 36, 0.81403971022032373, 6], [162, 26, 0.68023556218675918, 6]],
+[[0, 48, 0.93167602994982657, 18], [18, 43, 0.74561739030167007, 12], [30, 46, 0.67665470319990728, 12], [42, 48, 0.73851786387154794, 18], [60, 44, 0.75352126014453424, 12], [72, 46, 0.75590937199845964, 12], [84, 48, 0.8726524645273871, 24], [108, 43, 0.79414220458528362, 24], [132, 46, 0.8598346073676274, 18], [150, 48, 0.66261025791260963, 18], [168, 44, 0.88062785962456802, 12]],
+[[0, 43, 0.93901206412714844, 24], [24, 46, 0.79461956207575446, 12], [36, 48, 0.8536148773884813, 12], [48, 26, 0.77699901346010314, 12], [60, 38, 0.80201927443745236, 12], [72, 46, 0.8824256777989099, 18], [90, 43, 0.66315154329541037, 18], [108, 46, 0.75016329321047814, 24], [132, 48, 0.75189134738586749, 12], [144, 26, 0.78681239233281164, 24], [168, 38, 0.88189368494428921, 12], [180, 46, 0.89247235190963536, 12]]],
+45: [[[0, 44, 0.94518011772794652, 12], [12, 44, 0.7830987484625983, 12]],
+[[0, 46, 0.90290157319075504, 12], [12, 48, 0.86467319246923313, 12], [24, 48, 0.78680262296835513, 12]],
+[[0, 24, 0.96798263466509227, 6], [6, 24, 0.65818567220197688, 12], [18, 24, 0.73908977882088944, 6], [24, 24, 0.82487302557597897, 12], [36, 26, 0.86430561725912269, 12]],
+[[0, 38, 0.90647083194752109, 6], [6, 36, 0.70560977074726849, 12], [18, 41, 0.69958018755318219, 18], [36, 48, 0.82169575818820051, 24]],
+[[0, 31, 0.99860424539456261, 12], [12, 31, 0.82183433042147824, 6], [18, 32, 0.65070866181947695, 12], [30, 32, 0.69905866942133588, 12], [42, 29, 0.72838506173658346, 12], [54, 24, 0.71850797197710214, 18]],
+[[0, 29, 0.91596825589630426, 24], [24, 29, 0.82985385666137657, 18], [42, 26, 0.72742602236538489, 12], [54, 29, 0.66912018256160621, 6], [60, 29, 0.78500748670903264, 18], [78, 26, 0.6881865381976181, 6]],
+[[0, 48, 0.91109124045338852, 12], [12, 43, 0.83779434486013782, 12], [24, 29, 0.89932742780191233, 12], [36, 48, 0.87285699721950749, 18], [54, 48, 0.66667755083210567, 6], [60, 31, 0.77364510838250133, 6], [66, 34, 0.68121017665797934, 18], [84, 48, 0.75458189142889587, 12]],
+[[0, 24, 0.91610988067583499, 6], [6, 24, 0.69283383931976206, 18], [24, 31, 0.86954960388291525, 6], [30, 41, 0.70964172763759636, 24], [54, 41, 0.66869042186439875, 18], [72, 26, 0.85554679935647227, 6], [78, 44, 0.7452593301417868, 12], [90, 24, 0.70230156355309659, 18]],
+[[0, 38, 0.91572604900421906, 12], [12, 24, 0.85669267742049171, 24], [36, 32, 0.75305512563237198, 12], [48, 36, 0.82850275998701117, 12], [60, 43, 0.83752493216328128, 6], [66, 48, 0.69291496385445939, 6], [72, 29, 0.77399872521900726, 18], [90, 38, 0.74717264226707192, 12], [102, 24, 0.70543413934708088, 12], [114, 32, 0.69392877841708356, 6]],
+[[0, 46, 0.97472005688917795, 12], [12, 46, 0.84194119398767975, 18], [30, 43, 0.66555036381555965, 24], [54, 43, 0.74324307756224406, 12], [66, 46, 0.73380256622282092, 6], [72, 46, 0.84708920511565566, 12], [84, 43, 0.84284461264370403, 18], [102, 46, 0.66939371879901843, 18], [120, 46, 0.85476657834858305, 6], [126, 43, 0.7178341263302449, 6]],
+[[0, 26, 0.98477962058813506, 24], [24, 34, 0.80939568735824552, 12], [36, 38, 0.81361073583542709, 18], [54, 32, 0.70869496523362796, 18], [72, 24, 0.84849881576388253, 12], [84, 26, 0.8448979295194714, 24], [108, 34, 0.86787145957287393, 6], [114, 26, 0.69594654735848593, 6], [120, 34, 0.89064174225004222, 6], [126, 38, 0.6513207010090184, 12], [138, 32, 0.71588406162575979, 6]],
+[[0, 36, 0.99299083189814874, 12], [12, 26, 0.7793757352389723, 12], [24, 26, 0.87891262851006913, 12], [36, 26, 0.79508658025197543, 24], [60, 24, 0.78774932578170209, 12], [72, 29, 0.84436565395358665, 6], [78, 29, 0.67047539788121191, 6], [84, 36, 0.85070865648335614, 12], [96, 26, 0.81291157668203173, 12], [108, 26, 0.81137644053328883, 6], [114, 26, 0.7070908405665155, 6], [120, 24, 0.88732118605781773, 18], [138, 29, 0.71363255423629335, 12], [150, 29, 0.6562551224096419, 6]],
+[[0, 48, 0.9145300914728598, 18], [18, 26, 0.65478737597866565, 12], [30, 26, 0.74336143186174841, 18], [48, 24, 0.84832197704222434, 18], [66, 38, 0.66659050215889804, 18], [84, 38, 0.78577271653952674, 18], [102, 36, 0.71240931788152573, 12], [114, 48, 0.72252957409017815, 6], [120, 26, 0.85151588910719545, 12], [132, 26, 0.80101498704787144, 12], [144, 24, 0.75795094023862775, 18], [162, 38, 0.69834423836178239, 6]],
+[[0, 24, 0.93926641458085136, 12], [12, 36, 0.77948389082140968, 24], [36, 36, 0.81289668893186617, 12], [48, 41, 0.75005418101981447, 6], [54, 43, 0.7402004647180116, 12], [66, 36, 0.72028460159357122, 6], [72, 36, 0.82194999205376285, 12], [84, 24, 0.84117002163248311, 12], [96, 36, 0.84614119281567446, 12], [108, 36, 0.79298520925066185, 18], [126, 41, 0.68017066195947329, 6], [132, 43, 0.88204412169984758, 12], [144, 36, 0.85107812256406445, 6], [150, 36, 0.69048958195214882, 18], [168, 24, 0.85921334939658633, 6], [174, 36, 0.68223510218825367, 6]],
+[[0, 31, 0.93020373177928939, 12], [12, 44, 0.7774141704623323, 12], [24, 44, 0.77668890968678994, 6], [30, 34, 0.7008398648588019, 6], [36, 31, 0.75180785152119389, 12], [48, 44, 0.88814818559213593, 6], [54, 44, 0.71784084812885407, 24], [78, 31, 0.7454287952418448, 12], [90, 44, 0.67673745972669574, 24], [114, 44, 0.69200031002048668, 12], [126, 34, 0.7269866015235491, 24], [150, 31, 0.65458208183563982, 12], [162, 44, 0.66738698532035112, 6], [168, 44, 0.76108243126768671, 12], [180, 31, 0.78696367769738274, 6], [186, 44, 0.65426009077752789, 6]]],
+46: [[[0, 24, 0.98936795500214048, 12], [12, 26, 0.8725857199028878, 6], [18, 26, 0.74945130936475657, 6]],
+[[0, 26, 0.91342714955476889, 18], [18, 24, 0.73600634216578031, 18]],
+[[0, 41, 0.92197061830769611, 12], [12, 44, 0.76813597123404553, 6], [18, 48, 0.71965709161257196, 12], [30, 44, 0.74736208209228783, 12], [42, 48, 0.72138004467284511, 6]],
+[[0, 48, 0.96150228874234056, 12], [12, 43, 0.80538313467204981, 6], [18, 34, 0.74763178647986428, 18], [36, 29, 0.86138907624828687, 12], [48, 31, 0.7713336458116129, 6], [54, 32, 0.74059310746856022, 3], [57, 32, 0.74168012043862785, 3]],
+[[0, 43, 0.90267126167564915, 6], [6, 48, 0.68550762338300752, 6], [12, 38, 0.76126051705800368, 6], [18, 24, 0.72658312669571978, 6], [24, 32, 0.82272268436261542, 12], [36, 31, 0.80055989612808154, 6], [42, 34, 0.71512219794000553, 12], [54, 43, 0.67618490654574792, 12], [66, 48, 0.73331563951514755, 6]],
+[[0, 32, 0.90084162354046626, 18], [18, 36, 0.6962202313571485, 6], [24, 44, 0.75228358268274065, 12], [36, 36, 0.89150873779349349, 18], [54, 46, 0.70105755626552368, 6], [60, 46, 0.78080578981485371, 12], [72, 48, 0.77446004801761426, 12]],
+[[0, 29, 0.97922264872346088, 6], [6, 29, 0.72624134929249529, 6], [12, 29, 0.89532351953993428, 6], [18, 44, 0.70807811513951047, 6], [24, 24, 0.8174486196182863, 6], [30, 31, 0.69482363461232732, 12], [42, 24, 0.68288720675014736, 12], [54, 29, 0.74007681157863026, 18], [72, 29, 0.75914951581065127, 12], [84, 29, 0.86976201584168966, 12]],
+[[0, 36, 0.90459510602016191, 12], [12, 46, 0.83499262044908307, 12], [24, 48, 0.79834116807130384, 6], [30, 26, 0.72441664918901216, 6], [36, 44, 0.86919260703192891, 3], [39, 36, 0.70674521984748007, 3], [42, 24, 0.66086469769999889, 12], [54, 36, 0.69522290805382292, 6], [60, 46, 0.84446781753633171, 18], [78, 48, 0.66086658227759887, 18], [96, 26, 0.80897513163593149, 6], [102, 44, 0.73459407489365303, 6]],
+[[0, 43, 0.93924794632572528, 6], [6, 32, 0.6945591611020695, 6], [12, 34, 0.80949229767959985, 18], [30, 46, 0.72919046836919421, 18], [48, 48, 0.8134717788585355, 12], [60, 46, 0.82838615030891716, 18], [78, 46, 0.71028310964592689, 12], [90, 43, 0.68937364956843228, 12], [102, 32, 0.73027000218772553, 6], [108, 34, 0.86475237617393352, 12]],
+[[0, 48, 0.96566111301749458, 6], [6, 32, 0.72917047570486515, 12], [18, 32, 0.71148252742944496, 12], [30, 29, 0.70679605502998832, 18], [48, 26, 0.75584518483053598, 6], [54, 34, 0.6811621127306261, 12], [66, 32, 0.68833408725878464, 6], [72, 48, 0.82235365824929163, 6], [78, 32, 0.66591095525241761, 3], [81, 32, 0.66021028495125067, 3], [84, 29, 0.79173440490329239, 3], [87, 26, 0.67368047069234582, 3], [90, 34, 0.73272042962618922, 6], [96, 32, 0.79542685466292851, 12], [108, 48, 0.82806466407964363, 6], [114, 32, 0.68414571547298542, 18]],
+[[0, 34, 0.97982131352186275, 12], [12, 46, 0.76663601549914517, 12], [24, 46, 0.79522963632211419, 12], [36, 44, 0.87563518029394205, 12], [48, 43, 0.87004933235590276, 12], [60, 38, 0.75515434305697648, 18], [78, 44, 0.73502834003347151, 18], [96, 34, 0.81050043794001714, 6], [102, 46, 0.68458323374698293, 6], [108, 46, 0.75798345906799847, 18], [126, 44, 0.71039049275098332, 12], [138, 43, 0.67242007737444498, 6]],
+[[0, 46, 0.99576252550471833, 6], [6, 46, 0.65428187477849453, 6], [12, 48, 0.79191439619625525, 6], [18, 38, 0.72196581686389361, 3], [21, 38, 0.73848265695895554, 3], [24, 48, 0.78839507949966714, 18], [42, 43, 0.69283161812632166, 6], [48, 46, 0.77057075699121091, 6], [54, 46, 0.67268040267709106, 6], [60, 48, 0.75715342455569856, 12], [72, 38, 0.76865345125453155, 6], [78, 38, 0.71621452637210103, 12], [90, 48, 0.67575520105082076, 12], [102, 43, 0.65545693460725085, 12], [114, 46, 0.68594615809584081, 18], [132, 46, 0.85089178854885861, 12], [144, 48, 0.7775819136615717, 12]],
+[[0, 26, 0.91204589862776331, 6], [6, 24, 0.65725226436622575, 12], [18, 38, 0.70589520354606983, 6], [24, 24, 0.85428233582616908, 12], [36, 36, 0.8210926817074965, 6], [42, 34, 0.72735330726704661, 6], [48, 24, 0.82236616446931021, 6], [54, 26, 0.69523663005024861, 18], [72, 24, 0.77037034472791677, 18], [90, 38, 0.66650664743846366, 6], [96, 24, 0.86557375572850714, 6], [102, 36, 0.71464924511763483, 12], [114, 34, 0.66045460501773134, 18], [132, 24, 0.83215740371008551, 6], [138, 26, 0.65675244007484346, 3], [141, 24, 0.65217040181631092, 3], [144, 38, 0.79095619602758349, 6], [150, 24, 0.72792690053110287, 18]],
+[[0, 48, 0.91353414447482584, 12], [12, 38, 0.80723220783918959, 6], [18, 46, 0.69970937995729621, 18], [36, 48, 0.80601266074097278, 12], [48, 41, 0.78903273705012478, 18], [66, 46, 0.71641414111740565, 6], [72, 46, 0.75028740499683833, 6], [78, 48, 0.65994887433315086, 12], [90, 38, 0.65924310117492835, 12], [102, 46, 0.73345768424869884, 12], [114, 48, 0.71252845506308693, 12], [126, 41, 0.73208435584190035, 18], [144, 46, 0.89875653999865279, 3], [147, 46, 0.73230694567723975, 3], [150, 48, 0.67213046457170633, 18], [168, 38, 0.84145146755179412, 12]],
+[[0, 44, 0.92056142034809041, 12], [12, 36, 0.78341582320301939, 12], [24, 41, 0.86742257622018359, 18], [42, 34, 0.66524939146368733, 6], [48, 36, 0.87145223538443806, 3], [51, 36, 0.69934000929309625, 3], [54, 36, 0.65357590086799888, 6], [60, 44, 0.75669508915750949, 6], [66, 36, 0.67509691447151443, 18], [84, 41, 0.7702148463400027, 12], [96, 34, 0.76626806236210954, 6], [102, 36, 0.71883392128680645, 18], [120, 36, 0.8607349482392016, 18], [138, 36, 0.66983240788185805, 12], [150, 44, 0.69310617366290528, 6], [156, 36, 0.76328775296649676, 18], [174, 41, 0.66317185089445119, 6], [180, 34, 0.82202580930023839, 6], [186, 36, 0.72000925128923243, 6]]],
+47: [[[0, 24, 0.96436166550371705, 12], [12, 36, 0.89596858005994284, 12]],
+[[0, 31, 0.97984081066535356, 6], [6, 24, 0.65050021275323744, 12], [18, 24, 0.66074812271835204, 6], [24, 31, 0.81595555542728559, 3], [27, 38, 0.6814378442138096, 3], [30, 44, 0.65465035832766061, 3], [33, 46, 0.71934609827667628, 3]],
+[[0, 31, 0.92654893791600468, 6], [6, 36, 0.67944996686385473, 3], [9, 34, 0.70392356962536462, 3], [12, 41, 0.78222076421122189, 3], [15, 41, 0.73844016515663435, 3], [18, 34, 0.74932329005321885, 6], [24, 41, 0.85868574917435181, 18], [42, 41, 0.65567752839536675, 6]],
+[[0, 29, 0.95631996032378352, 6], [6, 32, 0.71616432108529993, 12], [18, 31, 0.69983787556030508, 12], [30, 24, 0.6741017619665518, 12], [42, 31, 0.71593320085734369, 12], [54, 29, 0.72130870749001708, 6]],
+[[0, 48, 0.98078574674845964, 12], [12, 48, 0.76321202443526037, 3], [15, 26, 0.67215518427261489, 3], [18, 26, 0.65394749242537942, 12], [30, 26, 0.6535350502919629, 6], [36, 48, 0.87193943203092017, 3], [39, 48, 0.71808674210353562, 3], [42, 26, 0.67600051341633594, 12], [54, 48, 0.72123495667941184, 6], [60, 48, 0.89321034135597643, 6], [66, 26, 0.74578526232041265, 6]],
+[[0, 48, 0.93712811177439304, 6], [6, 43, 0.66564870435097201, 12], [18, 48, 0.74028380083875733, 3], [21, 36, 0.68860784075824222, 3], [24, 24, 0.7802966297096281, 12], [36, 26, 0.86421789340290067, 6], [42, 24, 0.73832915461163307, 18], [60, 43, 0.75718696867154889, 12], [72, 48, 0.77679523252284222, 6], [78, 43, 0.7089038041814234, 6]],
+[[0, 44, 0.96011118545875962, 12], [12, 48, 0.80958581796983653, 6], [18, 29, 0.66166116341307057, 6], [24, 26, 0.81291843015095178, 12], [36, 26, 0.83623976512626863, 12], [48, 48, 0.76597244988267643, 18], [66, 29, 0.69817447895364459, 6], [72, 26, 0.77894655905344223, 6], [78, 44, 0.66191683505768184, 12], [90, 48, 0.68688489955518506, 6]],
+[[0, 26, 0.91403835744678918, 12], [12, 31, 0.82432824074420863, 6], [18, 48, 0.7426177213348174, 3], [21, 41, 0.7104698141081166, 3], [24, 44, 0.81381540617798098, 6], [30, 48, 0.66155237631957042, 6], [36, 41, 0.85785233344621081, 6], [42, 44, 0.68916768861534361, 6], [48, 26, 0.77360390681604285, 12], [60, 31, 0.77104632253770133, 12], [72, 48, 0.79003221372953225, 6], [78, 41, 0.72844679892540587, 3], [81, 44, 0.69195903746608267, 3], [84, 48, 0.84361875554256582, 3], [87, 41, 0.71422509136568124, 3], [90, 44, 0.68104538609955145, 6], [96, 26, 0.8623827696214057, 6], [102, 31, 0.74453671117172249, 6]],
+[[0, 41, 0.99800919268824373, 12], [12, 38, 0.86581234932815587, 12], [24, 48, 0.87579888319654553, 6], [30, 46, 0.66792267472180389, 12], [42, 46, 0.6993955554171144, 6], [48, 38, 0.84723370646891383, 12], [60, 31, 0.7505539215069259, 6], [66, 31, 0.74656554325840685, 6], [72, 41, 0.87223688150903989, 12], [84, 38, 0.7856888122902681, 12], [96, 48, 0.86124015585108871, 6], [102, 46, 0.65428663621264305, 6], [108, 46, 0.76907935042708864, 6], [114, 38, 0.69636050598628829, 6]],
+[[0, 29, 0.99697833355308418, 6], [6, 26, 0.67460788226697121, 6], [12, 24, 0.78045698236785921, 6], [18, 24, 0.69621873294570424, 18], [36, 36, 0.84455295772741079, 3], [39, 36, 0.65587409691953691, 3], [42, 48, 0.74122068767493676, 6], [48, 38, 0.83433637629965007, 6], [54, 29, 0.68138331955117426, 6], [60, 26, 0.83099295045240273, 12], [72, 24, 0.84712521357478177, 6], [78, 24, 0.67390547683173652, 12], [90, 36, 0.66822044867779107, 12], [102, 36, 0.68252019570944111, 6], [108, 48, 0.77988724409287391, 6], [114, 38, 0.70423632263040159, 6], [120, 29, 0.88149376688498593, 6], [126, 26, 0.65490319484847337, 6]],
+[[0, 24, 0.93017094330195482, 6], [6, 41, 0.74807489402756966, 12], [18, 24, 0.66753009486824688, 6], [24, 32, 0.79809166086615801, 12], [36, 41, 0.77314292075660851, 12], [48, 41, 0.88070763408231278, 6], [54, 24, 0.70095422289303155, 6], [60, 32, 0.86435696971092979, 6], [66, 24, 0.66646358407027384, 12], [78, 41, 0.68036199190656155, 6], [84, 24, 0.87954038764659437, 6], [90, 32, 0.73951623472144168, 18], [108, 41, 0.82835069143262463, 6], [114, 41, 0.70549966732057079, 12], [126, 24, 0.74223773650726577, 6], [132, 32, 0.84946088209079007, 12]],
+[[0, 46, 0.90297908855009956, 12], [12, 26, 0.79866419118484133, 6], [18, 26, 0.66913338202691175, 6], [24, 24, 0.77347882923146871, 12], [36, 26, 0.81203140007423813, 6], [42, 24, 0.73539798684034385, 12], [54, 46, 0.71194781810941854, 6], [60, 26, 0.85433963692556647, 12], [72, 46, 0.87689445657447951, 12], [84, 26, 0.84196260448168403, 12], [96, 26, 0.87644670007251124, 12], [108, 24, 0.7549210210990851, 12], [120, 26, 0.76643046199902609, 18], [138, 24, 0.71634106230086525, 6], [144, 46, 0.85359482772541573, 6], [150, 26, 0.67240668470239728, 3], [153, 46, 0.69567792876667001, 3]],
+[[0, 36, 0.96768870078758251, 6], [6, 38, 0.68656724560009963, 3], [9, 43, 0.65546829443655541, 3], [12, 36, 0.80274060698965111, 6], [18, 38, 0.69585012436327243, 12], [30, 43, 0.74718930906061842, 12], [42, 48, 0.69197537366554862, 6], [48, 43, 0.86636613482671421, 3], [51, 36, 0.744467246104074, 3], [54, 38, 0.73609346610103676, 6], [60, 43, 0.83199451794032453, 6], [66, 36, 0.6658128355304358, 12], [78, 38, 0.73439343116763378, 3], [81, 43, 0.65666429101882384, 3], [84, 48, 0.78075183708432538, 12], [96, 43, 0.86322716544829858, 6], [102, 36, 0.72889155937294903, 6], [108, 38, 0.84441202926089609, 12], [120, 43, 0.7792597750446173, 6], [126, 36, 0.66183471258142346, 3], [129, 38, 0.68690149986916704, 3], [132, 43, 0.77484017024605367, 12], [144, 48, 0.86382172928033463, 12], [156, 43, 0.82845496352022174, 12]],
+[[0, 24, 0.95877589814905928, 12], [12, 24, 0.86402668645625536, 6], [18, 38, 0.67654671626649709, 6], [24, 31, 0.75469335642480484, 12], [36, 44, 0.75338304394865629, 6], [42, 36, 0.68532548312939268, 12], [54, 24, 0.65460204182087589, 12], [66, 24, 0.69055422573613345, 6], [72, 24, 0.76571365104017142, 12], [84, 24, 0.87876484135603161, 6], [90, 38, 0.66006265123033936, 12], [102, 31, 0.66784321990659001, 12], [114, 44, 0.66460955797330634, 6], [120, 36, 0.79361056032448984, 6], [126, 24, 0.65863282519248267, 6], [132, 24, 0.7779794960700277, 12], [144, 24, 0.86039971962788286, 6], [150, 24, 0.69794868928649756, 6], [156, 38, 0.75701145978860662, 12], [168, 31, 0.81903747049107334, 12]],
+[[0, 26, 0.92731505235156875, 6], [6, 26, 0.70830731594634944, 6], [12, 38, 0.79439268104124594, 6], [18, 36, 0.66580040303799148, 18], [36, 26, 0.83225693639708787, 12], [48, 38, 0.82408337171411206, 12], [60, 36, 0.76165812649061437, 12], [72, 26, 0.89726190068072686, 6], [78, 26, 0.66681232448147632, 6], [84, 26, 0.84865751983676052, 6], [90, 38, 0.72314954409401377, 12], [102, 36, 0.65118800561733181, 12], [114, 26, 0.65187584402129273, 6], [120, 38, 0.89343952953417505, 12], [132, 36, 0.77214997613009773, 12], [144, 26, 0.87759314660843568, 6], [150, 26, 0.68770781842881901, 12], [162, 26, 0.69421605418181964, 12], [174, 38, 0.73609851193703324, 6], [180, 36, 0.79062766692084263, 6], [186, 26, 0.66180998753627396, 6]]],
+48: [[[0, 31, 0.9519845782009323, 6], [6, 31, 0.66148664109175825, 18]],
+[[0, 43, 0.91532500492313373, 6], [6, 34, 0.7403339511644994, 12], [18, 32, 0.6779900839320373, 6], [24, 38, 0.82051823313134731, 3], [27, 38, 0.65974821012589824, 3], [30, 29, 0.67086094101346394, 6]],
+[[0, 24, 0.94247397519817111, 12], [12, 29, 0.84199947027876887, 3], [15, 36, 0.72689179924952474, 3], [18, 46, 0.7411628066580358, 12], [30, 44, 0.74555256350167287, 6], [36, 46, 0.89146323822368334, 6], [42, 48, 0.65549927868472324, 6]],
+[[0, 24, 0.9808503761982903, 12], [12, 48, 0.77450328215074549, 3], [15, 46, 0.70615547638190712, 3], [18, 46, 0.7454969641584982, 12], [30, 46, 0.74678547682851204, 6], [36, 38, 0.78077895797871344, 3], [39, 48, 0.72198828244836766, 3], [42, 44, 0.72417041099996959, 6], [48, 24, 0.87403047743884932, 3], [51, 48, 0.69486989229810248, 3], [54, 46, 0.7042507192325661, 6]],
+[[0, 44, 0.91188180781469952, 6], [6, 26, 0.7366927499671333, 6], [12, 26, 0.86348436022561226, 6], [18, 24, 0.6756743242488169, 6], [24, 31, 0.78033470861633958, 12], [36, 26, 0.77496034322686391, 18], [54, 26, 0.72419806101814177, 12], [66, 41, 0.68294371531280296, 6]],
+[[0, 46, 0.92798151101057813, 6], [6, 24, 0.72061416945619705, 12], [18, 29, 0.72949356728269543, 6], [24, 34, 0.79280389990678279, 3], [27, 36, 0.69421662656233474, 3], [30, 48, 0.67682744149388785, 6], [36, 36, 0.85250439618108365, 6], [42, 24, 0.71510916671607383, 3], [45, 46, 0.73873132201074709, 3], [48, 24, 0.81948744555493125, 12], [60, 29, 0.79548553736625749, 6], [66, 34, 0.72452034163708356, 12], [78, 36, 0.68536000884940451, 6]],
+[[0, 46, 0.90342579335593731, 6], [6, 46, 0.66490476575762192, 6], [12, 48, 0.80292287003408092, 12], [24, 24, 0.86221231313468571, 6], [30, 38, 0.69099375209944935, 6], [36, 26, 0.80589866931009446, 12], [48, 43, 0.87526374789588757, 12], [60, 48, 0.78721411230441674, 18], [78, 46, 0.66001437891244952, 6], [84, 46, 0.84718022231797663, 6], [90, 48, 0.74438818227729919, 6]],
+[[0, 34, 0.93770175168675274, 12], [12, 29, 0.77090498921403972, 6], [18, 44, 0.68849327491827483, 6], [24, 29, 0.86242519755135338, 6], [30, 41, 0.73533731287626813, 3], [33, 31, 0.71575422366178032, 3], [36, 48, 0.85276040811569664, 6], [42, 32, 0.7397355390011191, 3], [45, 34, 0.67409129361889775, 3], [48, 29, 0.88016497508424241, 6], [54, 44, 0.7497812048863457, 3], [57, 29, 0.68301316873471796, 3], [60, 41, 0.77186513410567581, 6], [66, 31, 0.69429290594744519, 3], [69, 48, 0.74667857629133527, 3], [72, 32, 0.86112461242461691, 6], [78, 34, 0.66333971667947988, 6], [84, 29, 0.75624000582403739, 3], [87, 44, 0.74821289732267859, 3], [90, 29, 0.70020528791581549, 12], [102, 41, 0.73932247740689339, 6]],
+[[0, 48, 0.99724344651642349, 6], [6, 31, 0.69475186417773549, 12], [18, 26, 0.66804122941437505, 3], [21, 36, 0.67715293702264201, 3], [24, 24, 0.82444607529031788, 12], [36, 24, 0.86737774266482226, 12], [48, 34, 0.80470232571193012, 12], [60, 44, 0.76852323168203951, 3], [63, 48, 0.65248258870905151, 3], [66, 31, 0.67080283101652238, 6], [72, 26, 0.82800046156540985, 6], [78, 36, 0.66089124432250068, 6], [84, 24, 0.78068807481894831, 6], [90, 24, 0.71241677172969764, 6], [96, 34, 0.82314485719462338, 12], [108, 44, 0.88205060634196275, 6], [114, 48, 0.66121512628784396, 3], [117, 31, 0.6869402406581181, 3]],
+[[0, 29, 0.98114302925233732, 12], [12, 24, 0.86032943343795687, 12], [24, 26, 0.75186332506936671, 6], [30, 24, 0.70905655529709044, 6], [36, 29, 0.77032812359988923, 6], [42, 29, 0.74640723995290414, 6], [48, 29, 0.88666734900794419, 12], [60, 41, 0.85101348459529869, 6], [66, 29, 0.74511174373503108, 12], [78, 24, 0.66051747217393508, 12], [90, 26, 0.72687112102642848, 6], [96, 24, 0.88250841970159766, 3], [99, 29, 0.74143059236535069, 3], [102, 29, 0.67239561775642986, 6], [108, 29, 0.88191725154236456, 6], [114, 41, 0.73560140482856129, 12], [126, 29, 0.7081332126576193, 3], [129, 24, 0.68983794788026498, 3]],
+[[0, 36, 0.96595818273256528, 12], [12, 31, 0.84436398777525179, 3], [15, 36, 0.72450729579584827, 3], [18, 29, 0.74438957992389043, 6], [24, 34, 0.8768189634671848, 12], [36, 26, 0.85743207173718183, 3], [39, 44, 0.69008383418869457, 3], [42, 24, 0.70944847757565099, 6], [48, 36, 0.81499371421277444, 6], [54, 31, 0.72947094220567699, 6], [60, 36, 0.89655275133783419, 6], [66, 29, 0.7187511681399904, 12], [78, 34, 0.6933835554429989, 3], [81, 26, 0.74111496686863243, 3], [84, 44, 0.83978279767798858, 6], [90, 24, 0.66137695908950145, 12], [102, 36, 0.732209492112884, 6], [108, 31, 0.75056348828755237, 6], [114, 36, 0.74022393982853973, 6], [120, 29, 0.8087512982510201, 6], [126, 34, 0.65364047126839175, 3], [129, 26, 0.73727881786794847, 3], [132, 44, 0.78855945462701182, 12]],
+[[0, 44, 0.91464355200880987, 12], [12, 26, 0.89190697112402662, 12], [24, 26, 0.77056561125832623, 12], [36, 24, 0.88359184969486471, 3], [39, 24, 0.7249299538781746, 3], [42, 34, 0.68282535051255366, 12], [54, 36, 0.66975070693284722, 3], [57, 36, 0.72285153108276079, 3], [60, 44, 0.86685826038148983, 6], [66, 26, 0.67323082698532211, 6], [72, 26, 0.87931775084878305, 6], [78, 24, 0.73870864878076481, 12], [90, 24, 0.73244848057180389, 12], [102, 34, 0.71103604967480161, 12], [114, 36, 0.6707548109158028, 6], [120, 36, 0.87436863593253322, 3], [123, 44, 0.74708637155716939, 3], [126, 26, 0.68600327879947898, 6], [132, 26, 0.8961768994620104, 3], [135, 24, 0.71746522902882126, 3], [138, 24, 0.73932198976408259, 6], [144, 34, 0.79988535620524992, 6], [150, 36, 0.66619714499791627, 6]],
+[[0, 41, 0.95463348434194217, 6], [6, 26, 0.70851865153930138, 3], [9, 43, 0.70222886795777006, 3], [12, 36, 0.75132011300729218, 6], [18, 36, 0.74375444208246821, 6], [24, 43, 0.85718822108503701, 3], [27, 29, 0.73563350547849959, 3], [30, 26, 0.71017541202023149, 12], [42, 41, 0.74962435400571248, 18], [60, 26, 0.82997355917312854, 3], [63, 43, 0.67078704439485903, 3], [66, 36, 0.70237730017512046, 3], [69, 36, 0.65362282475543176, 3], [72, 43, 0.88755913713788015, 3], [75, 29, 0.67546352280279975, 3], [78, 26, 0.68103639567219509, 3], [81, 41, 0.71968625907625206, 3], [84, 26, 0.7899489720240308, 6], [90, 43, 0.72544169148392346, 12], [102, 36, 0.72720827241034625, 12], [114, 36, 0.72693697364201459, 3], [117, 43, 0.66684702262945905, 3], [120, 29, 0.88998305373736775, 3], [123, 26, 0.66204492866375064, 3], [126, 41, 0.71500172487711045, 6], [132, 26, 0.81860063306260966, 12], [144, 43, 0.85908584938115973, 6], [150, 36, 0.69749876493385643, 12], [162, 36, 0.74902807931348048, 6]],
+[[0, 36, 0.90307095049117447, 3], [3, 48, 0.72610164917878661, 3], [6, 44, 0.72977750551822052, 3], [9, 36, 0.68591572662251998, 3], [12, 36, 0.78068176970337999, 6], [18, 44, 0.74405365765520026, 18], [36, 48, 0.79850326213735845, 12], [48, 29, 0.87713229787566283, 6], [54, 36, 0.74418860979845081, 6], [60, 48, 0.81422308476884964, 12], [72, 44, 0.85065876317830047, 12], [84, 36, 0.75690865842308042, 3], [87, 36, 0.6990783435665251, 3], [90, 44, 0.67301633338681688, 6], [96, 48, 0.8276138327257383, 6], [102, 29, 0.68049226775505456, 6], [108, 36, 0.7966531044521572, 6], [114, 48, 0.74435834505880594, 6], [120, 44, 0.8565903479322643, 6], [126, 36, 0.67188137483548993, 18], [144, 36, 0.8647502488189025, 3], [147, 44, 0.67659905220269156, 3], [150, 48, 0.6620787364639551, 12], [162, 29, 0.68878643582028176, 12], [174, 36, 0.7028283501011624, 3], [177, 48, 0.74951708626591462, 3]],
+[[0, 24, 0.93436078191478544, 6], [6, 43, 0.67580812458692985, 6], [12, 44, 0.82866586482264748, 18], [30, 48, 0.67143260653238224, 6], [36, 24, 0.77169242534726412, 12], [48, 24, 0.88151519667429012, 12], [60, 43, 0.86159247507435643, 6], [66, 43, 0.65446589153881629, 3], [69, 24, 0.65834482751684675, 3], [72, 43, 0.86991463923783929, 3], [75, 44, 0.7028434141085188, 3], [78, 48, 0.73463539580328008, 12], [90, 24, 0.74275872107052898, 18], [108, 24, 0.86860947895014051, 6], [114, 43, 0.74634760633904884, 6], [120, 43, 0.75575254291387484, 3], [123, 24, 0.72417709780114592, 3], [126, 43, 0.72629007614077001, 18], [144, 44, 0.884582212278059, 6], [150, 48, 0.67857423305759201, 6], [156, 24, 0.80769295784005646, 6], [162, 24, 0.72307184943733394, 6], [168, 43, 0.83998167334502072, 18], [186, 43, 0.68771023215321669, 3], [189, 24, 0.74879753520920977, 3]]],
+51: [[[0, 36, 0.99541106009076363, 6], [6, 46, 0.73260915769346213, 18]],
+[[0, 36, 0.95686326372439812, 6], [6, 29, 0.66803852617132675, 12], [18, 43, 0.69620494584044779, 3], [21, 48, 0.71732205090126322, 3], [24, 43, 0.87837728290941208, 6], [30, 34, 0.66855319815863457, 3], [33, 48, 0.7204477918766885, 3]],
+[[0, 41, 0.98441254489755303, 12], [12, 24, 0.83875070200413304, 3], [15, 34, 0.67858661840639345, 3], [18, 36, 0.72718943244090883, 6], [24, 41, 0.77340447855700356, 3], [27, 24, 0.66548175645723961, 3], [30, 34, 0.66650306595873321, 6], [36, 36, 0.76605460892682264, 3], [39, 36, 0.74891609241534274, 3], [42, 41, 0.72996864216851987, 6]],
+[[0, 36, 0.93173094953488189, 3], [3, 43, 0.74073950691436141, 3], [6, 48, 0.70072348146699315, 6], [12, 41, 0.76569067925602818, 6], [18, 31, 0.69922249726037244, 3], [21, 26, 0.68786064845143091, 3], [24, 24, 0.76026064513566438, 12], [36, 31, 0.85690315396728145, 18], [54, 48, 0.66886452291774134, 6]],
+[[0, 24, 0.93884332604277865, 6], [6, 44, 0.69197509491892684, 12], [18, 26, 0.7483747098573984, 12], [30, 36, 0.6558579311285917, 12], [42, 36, 0.73335616918422786, 12], [54, 24, 0.65320763147080885, 6], [60, 41, 0.84820638534294346, 12]],
+[[0, 31, 0.96383778280217647, 3], [3, 32, 0.6827880150714456, 3], [6, 29, 0.70447053132698045, 6], [12, 31, 0.87367112434651306, 6], [18, 32, 0.74348275851346324, 6], [24, 29, 0.77360797269140757, 12], [36, 31, 0.79043953832063374, 6], [42, 32, 0.72627113577016511, 6], [48, 29, 0.84376500788700848, 12], [60, 31, 0.81462177207714259, 18], [78, 32, 0.68169125425191512, 6]],
+[[0, 31, 0.96068171090739762, 6], [6, 26, 0.65861447380552907, 12], [18, 26, 0.74101651247292311, 6], [24, 26, 0.78726048069792942, 12], [36, 46, 0.83565851088859266, 6], [42, 38, 0.73391584839476232, 6], [48, 44, 0.82934710206140072, 3], [51, 26, 0.72444014962606285, 3], [54, 46, 0.67278460617157154, 6], [60, 31, 0.77345755765203228, 3], [63, 26, 0.67551175192672341, 3], [66, 26, 0.68034946847861044, 6], [72, 26, 0.82150284683550578, 12], [84, 46, 0.7948886836198481, 6], [90, 38, 0.7037327477333748, 6]],
+[[0, 46, 0.91853925086365051, 6], [6, 48, 0.71034375361418967, 6], [12, 26, 0.80642025296922737, 6], [18, 44, 0.66175212491105695, 6], [24, 48, 0.76165156043098392, 18], [42, 32, 0.70579875836028549, 12], [54, 34, 0.70550361289299857, 6], [60, 44, 0.83584841426872336, 12], [72, 48, 0.78773502919200367, 3], [75, 46, 0.71030351931987157, 3], [78, 48, 0.73706171261138342, 6], [84, 26, 0.76436734995810229, 3], [87, 44, 0.65720279263841008, 3], [90, 48, 0.67912438999196589, 18]],
+[[0, 43, 0.97231796897286327, 3], [3, 26, 0.72658244613224088, 3], [6, 48, 0.73681970189006962, 12], [18, 36, 0.68032126142051519, 3], [21, 24, 0.67535741140257477, 3], [24, 26, 0.78389505191830122, 3], [27, 48, 0.70788715139682046, 3], [30, 36, 0.70687613347167932, 3], [33, 24, 0.70361798003115472, 3], [36, 43, 0.80560120866659679, 3], [39, 26, 0.72308872983396277, 3], [42, 48, 0.68206261793670431, 12], [54, 36, 0.7323321047104826, 3], [57, 24, 0.74968366579280366, 3], [60, 26, 0.75527865850601394, 6], [66, 48, 0.7342044083489675, 3], [69, 36, 0.6672363054315491, 3], [72, 24, 0.89189183056065324, 6], [78, 43, 0.67292403795720823, 6], [84, 26, 0.75614257965761245, 12], [96, 48, 0.84013511294014387, 12], [108, 36, 0.82043615367446099, 12]],
+[[0, 44, 0.94162462678270076, 6], [6, 48, 0.70758802315634106, 6], [12, 43, 0.7712703029104484, 12], [24, 26, 0.80228725499455, 12], [36, 24, 0.79627887815800358, 6], [42, 46, 0.73384835033396267, 3], [45, 48, 0.66943773616310254, 3], [48, 43, 0.81503270622407853, 6], [54, 26, 0.7026295837129779, 3], [57, 44, 0.72849293289411399, 3], [60, 48, 0.84241732215133736, 6], [66, 43, 0.72272501393930599, 6], [72, 26, 0.77484508677855668, 6], [78, 24, 0.70336201048446545, 3], [81, 46, 0.66362489844933381, 3], [84, 48, 0.79850379562086116, 6], [90, 43, 0.70560593407415961, 6], [96, 26, 0.87901638630403822, 6], [102, 44, 0.74054388969005958, 12], [114, 48, 0.73235687793300708, 3], [117, 43, 0.68422042763291202, 3], [120, 26, 0.86692578940904619, 6], [126, 24, 0.72068804918849294, 6]],
+[[0, 29, 0.96256192704686339, 12], [12, 43, 0.83644191013924363, 12], [24, 48, 0.87365209097936702, 3], [27, 29, 0.67152519733045435, 3], [30, 43, 0.68707777109903168, 12], [42, 48, 0.67147736168069372, 12], [54, 29, 0.73243234399052037, 3], [57, 43, 0.65776330067453748, 3], [60, 48, 0.7725591356173247, 6], [66, 29, 0.69106262611054892, 6], [72, 43, 0.79738795870023782, 12], [84, 48, 0.81298152427672787, 3], [87, 29, 0.6892770578442734, 3], [90, 43, 0.67301082230280085, 3], [93, 48, 0.74249401425620687, 3], [96, 29, 0.81091557267987957, 3], [99, 43, 0.66546631289543168, 3], [102, 48, 0.67623614844894886, 6], [108, 29, 0.8676349042942858, 6], [114, 43, 0.74316735913931642, 3], [117, 48, 0.71928697423910515, 3], [120, 29, 0.76838043481181306, 3], [123, 43, 0.67806300432936784, 3], [126, 48, 0.66559009320239737, 3], [129, 29, 0.70113644402896613, 3], [132, 43, 0.82894103239279027, 12]],
+[[0, 46, 0.92776096885657522, 6], [6, 24, 0.73134122605612739, 3], [9, 31, 0.68345375915203654, 3], [12, 44, 0.87420851960683199, 12], [24, 48, 0.8678492318367711, 6], [30, 32, 0.71144667301571618, 6], [36, 24, 0.75153428220284213, 6], [42, 46, 0.71993570546108121, 6], [48, 48, 0.77902857360954858, 18], [66, 46, 0.73711284553879119, 12], [78, 24, 0.71195028564497043, 3], [81, 31, 0.67424411174773646, 3], [84, 44, 0.78512044332988085, 3], [87, 48, 0.70818997136283768, 3], [90, 32, 0.7466392526898834, 6], [96, 24, 0.81655116865225519, 12], [108, 46, 0.80546194638380708, 3], [111, 48, 0.68944727354868562, 3], [114, 46, 0.72776658462333998, 12], [126, 24, 0.66664584210135303, 6], [132, 31, 0.76820075138106436, 6], [138, 44, 0.73942218197476839, 3], [141, 48, 0.68662434669989458, 3], [144, 32, 0.75600496647433579, 12]],
+[[0, 24, 0.94447346683772171, 12], [12, 24, 0.82748642311994747, 3], [15, 26, 0.68771656411080606, 3], [18, 31, 0.72752749656233118, 6], [24, 36, 0.79974025112004887, 3], [27, 34, 0.66923137260807042, 3], [30, 36, 0.67953027812430822, 6], [36, 24, 0.76028612519095962, 3], [39, 24, 0.6906262033787155, 3], [42, 24, 0.65053940906441554, 12], [54, 24, 0.6863614318272907, 12], [66, 26, 0.71947974017820226, 18], [84, 31, 0.76856508797784928, 12], [96, 36, 0.87348145059144677, 6], [102, 34, 0.73171436916605759, 3], [105, 36, 0.74978579055393968, 3], [108, 24, 0.86589898897346063, 6], [114, 24, 0.65715155321904162, 6], [120, 24, 0.82559794401373443, 12], [132, 24, 0.75907585472953332, 6], [138, 26, 0.67966513594643874, 12], [150, 31, 0.72189614576130379, 12], [162, 36, 0.66348043156904546, 3], [165, 34, 0.71246288969432103, 3]],
+[[0, 24, 0.96476677851370174, 18], [18, 24, 0.73153489970804675, 12], [30, 46, 0.65526862093698579, 6], [36, 38, 0.75770643465602272, 3], [39, 38, 0.70502630976199332, 3], [42, 26, 0.65905345820305283, 3], [45, 24, 0.71426954141581767, 3], [48, 24, 0.86442336284178423, 12], [60, 46, 0.86693010636499335, 3], [63, 24, 0.68033137658618004, 3], [66, 24, 0.72012878410836212, 6], [72, 46, 0.85651709516576457, 12], [84, 38, 0.76191899481707759, 3], [87, 38, 0.68513576862496905, 3], [90, 26, 0.65480239055086376, 3], [93, 24, 0.73468527194735422, 3], [96, 24, 0.82671042584779708, 6], [102, 46, 0.74888888911233664, 12], [114, 24, 0.70018194130598388, 6], [120, 24, 0.78554771433546955, 3], [123, 46, 0.70367003907937842, 3], [126, 38, 0.69971125676923995, 12], [138, 38, 0.66326329961671582, 6], [144, 26, 0.84248706140873242, 3], [147, 24, 0.7061422673494, 3], [150, 24, 0.72738625432801973, 3], [153, 46, 0.73857255301164837, 3], [156, 24, 0.82155527238585901, 12], [168, 24, 0.7689170266375428, 3], [171, 46, 0.70917658857947652, 3], [174, 38, 0.71683146061854774, 3], [177, 38, 0.73060733591262572, 3]],
+[[0, 44, 0.90594953197942985, 12], [12, 48, 0.84427460948140198, 12], [24, 24, 0.89938337425993853, 3], [27, 46, 0.73462690905700456, 3], [30, 48, 0.72714428931624742, 12], [42, 41, 0.69231330443415939, 6], [48, 41, 0.89895809465945908, 12], [60, 48, 0.84483983739107837, 12], [72, 41, 0.85755605437050186, 12], [84, 44, 0.78539378658510373, 6], [90, 48, 0.69481376986701071, 18], [108, 24, 0.83558669338406344, 18], [126, 46, 0.70632773695847928, 6], [132, 48, 0.86059238425530005, 3], [135, 41, 0.71512272400183474, 3], [138, 41, 0.74878235700842599, 3], [141, 48, 0.68347688078001578, 3], [144, 41, 0.86236412036937615, 6], [150, 44, 0.68695711055368791, 3], [153, 48, 0.69574560451383161, 3], [156, 24, 0.89574453585474556, 3], [159, 46, 0.68917137441437382, 3], [162, 48, 0.67197177122195872, 3], [165, 41, 0.74566437758167992, 3], [168, 41, 0.76346738520215651, 3], [171, 48, 0.71775023190012277, 3], [174, 41, 0.65393495050357608, 6], [180, 44, 0.82028773327358029, 6], [186, 48, 0.74754757317857623, 3], [189, 24, 0.73598852398275449, 3]]],
+60: [[[0, 46, 0.95495846582732946, 6], [6, 46, 0.7056084509580911, 6], [12, 46, 0.7979565175650446, 6], [18, 48, 0.67692159599480106, 3], [21, 24, 0.70041613490042598, 3]],
+[[0, 24, 0.93457689485656936, 12], [12, 36, 0.82833675359799286, 12], [24, 36, 0.81253761435252581, 3], [27, 24, 0.69315158189008297, 3], [30, 46, 0.66162730059443342, 3], [33, 46, 0.74582388744615435, 3]],
+[[0, 36, 0.95938443142216379, 6], [6, 44, 0.6794744896786209, 3], [9, 31, 0.71929919286346189, 3], [12, 29, 0.88909861618976249, 3], [15, 46, 0.74280227615973171, 3], [18, 34, 0.74877365184948597, 3], [21, 38, 0.70274444701105809, 3], [24, 48, 0.83617335414506033, 6], [30, 43, 0.65304856153150093, 3], [33, 36, 0.66501869909462263, 3], [36, 44, 0.81838608169605209, 3], [39, 31, 0.70396149897103577, 3], [42, 29, 0.69719769574389612, 3], [45, 46, 0.69533207200944447, 3]],
+[[0, 31, 0.94162850716559854, 3], [3, 36, 0.73927224108025391, 3], [6, 44, 0.69802016311305115, 6], [12, 48, 0.77540430982500119, 12], [24, 43, 0.76997809185589494, 3], [27, 48, 0.66223273985824416, 3], [30, 46, 0.66197369510057735, 12], [42, 24, 0.70163447237983689, 6], [48, 24, 0.86834836307232066, 6], [54, 31, 0.71872191656751983, 6]],
+[[0, 43, 0.91990245843783669, 3], [3, 43, 0.74146083463324775, 3], [6, 43, 0.65616352270449152, 6], [12, 41, 0.80722069117291395, 3], [15, 43, 0.72546810029235431, 3], [18, 41, 0.68495197506119287, 6], [24, 29, 0.84031825774509628, 6], [30, 31, 0.74035791924198469, 6], [36, 41, 0.80060477487501536, 3], [39, 43, 0.72329467184807805, 3], [42, 43, 0.67913373726121318, 3], [45, 43, 0.67708116605044721, 3], [48, 41, 0.8351548502246976, 3], [51, 43, 0.71618704381116172, 3], [54, 41, 0.68355808636980042, 3], [57, 29, 0.74261228242457278, 3], [60, 31, 0.89713367585101245, 3], [63, 41, 0.74176998820545847, 3], [66, 43, 0.73811445627502681, 6]],
+[[0, 43, 0.95390602181960815, 6], [6, 38, 0.65981083294909981, 12], [18, 26, 0.66962965674500186, 12], [30, 36, 0.74887415781650646, 3], [33, 31, 0.68610290352329928, 3], [36, 31, 0.75122687499895768, 12], [48, 32, 0.81004220690444317, 3], [51, 26, 0.67828388012894858, 3], [54, 29, 0.69979429218023792, 3], [57, 43, 0.70649727014136543, 3], [60, 38, 0.82259012639831453, 6], [66, 26, 0.68720690881875934, 6], [72, 36, 0.86601093478524205, 3], [75, 31, 0.67226652037962376, 3], [78, 31, 0.69981199664909566, 6]],
+[[0, 34, 0.9152305719509124, 12], [12, 34, 0.86726762262772328, 6], [18, 26, 0.71782087186082666, 3], [21, 26, 0.66074340576680357, 3], [24, 41, 0.79588140214535097, 3], [27, 24, 0.7058420861964666, 3], [30, 41, 0.70968146774175189, 3], [33, 48, 0.74532080425996106, 3], [36, 46, 0.82594126990237027, 3], [39, 34, 0.71394838806424943, 3], [42, 34, 0.74851180681998386, 3], [45, 26, 0.70189165563611711, 3], [48, 26, 0.77142501248406936, 3], [51, 41, 0.72184112190763905, 3], [54, 24, 0.66749799254881259, 12], [66, 41, 0.66916612150586097, 6], [72, 48, 0.8520252879536846, 6], [78, 46, 0.692495161394167, 12], [90, 34, 0.74019235425106189, 3], [93, 34, 0.66649610390608838, 3]],
+[[0, 31, 0.93013831013676551, 3], [3, 26, 0.68116299845483019, 3], [6, 34, 0.65158585617521825, 3], [9, 26, 0.6698563308488612, 3], [12, 24, 0.81930097247203637, 12], [24, 38, 0.86605999717021098, 6], [30, 32, 0.66174295107555625, 6], [36, 24, 0.81048002858834756, 6], [42, 32, 0.67007908310433661, 3], [45, 31, 0.72158537488757135, 3], [48, 26, 0.78043252256917062, 12], [60, 34, 0.80017904216987834, 3], [63, 26, 0.72360203760035968, 3], [66, 24, 0.66759031118370293, 6], [72, 38, 0.88342637365234766, 6], [78, 32, 0.66727459791970334, 3], [81, 24, 0.70976903255313506, 3], [84, 32, 0.75092232713714069, 3], [87, 31, 0.70151180971639759, 3], [90, 26, 0.67298176401612708, 6], [96, 34, 0.76939155851770946, 3], [99, 26, 0.71697205067147529, 3], [102, 24, 0.7110923629003465, 6]],
+[[0, 41, 0.96961028998622656, 6], [6, 36, 0.66521162314572002, 6], [12, 24, 0.86853060093968859, 3], [15, 44, 0.69604624007517679, 3], [18, 44, 0.6620327489008192, 6], [24, 44, 0.78056141734105799, 3], [27, 41, 0.67223179924124066, 3], [30, 24, 0.70314020879854366, 6], [36, 38, 0.88745994431864916, 3], [39, 41, 0.65484492053875998, 3], [42, 36, 0.73957029421457365, 6], [48, 24, 0.83389558812188336, 3], [51, 44, 0.71089476921474981, 3], [54, 44, 0.65064178632498171, 6], [60, 44, 0.85876550861078704, 6], [66, 41, 0.72596804151246874, 3], [69, 24, 0.7348130106333417, 3], [72, 38, 0.81155225760882133, 6], [78, 41, 0.72514282950241093, 6], [84, 36, 0.78841569616598339, 3], [87, 24, 0.67692208275158749, 3], [90, 44, 0.69307008892762434, 3], [93, 44, 0.72701779393814836, 3], [96, 44, 0.75717832604320257, 3], [99, 41, 0.71783239221773709, 3], [102, 24, 0.66216193230899889, 6], [108, 38, 0.82669208944527039, 3], [111, 41, 0.71662804546238112, 3], [114, 36, 0.67816773923692297, 6]],
+[[0, 32, 0.92306828295908494, 6], [6, 41, 0.70180864471674009, 3], [9, 24, 0.65010217166548412, 3], [12, 41, 0.85181440091428151, 6], [18, 44, 0.70524582017888293, 6], [24, 44, 0.77929225760542442, 6], [30, 26, 0.67143643144438148, 6], [36, 38, 0.82427933308272361, 3], [39, 24, 0.7434286582112567, 3], [42, 32, 0.69330549294846378, 3], [45, 41, 0.71464720778213031, 3], [48, 24, 0.89090103695402501, 6], [54, 41, 0.68623041480483804, 6], [60, 44, 0.8976401178784752, 6], [66, 44, 0.74788282309998955, 6], [72, 26, 0.85767968349603674, 12], [84, 38, 0.85374073797558558, 3], [87, 24, 0.65883587139052746, 3], [90, 32, 0.74128669214965215, 6], [96, 41, 0.82957970630471323, 3], [99, 24, 0.73344116891227751, 3], [102, 41, 0.71815419433696415, 3], [105, 44, 0.71174961453864294, 3], [108, 44, 0.89954876784322713, 12], [120, 26, 0.84016982724441513, 12]],
+[[0, 36, 0.94553305377293628, 12], [12, 26, 0.76094322603233466, 6], [18, 43, 0.73120142043478076, 3], [21, 46, 0.71310758397384699, 3], [24, 36, 0.84893761258814182, 6], [30, 24, 0.68033879675520248, 12], [42, 24, 0.68867160184771459, 3], [45, 36, 0.65482839070614995, 3], [48, 44, 0.88911705967638366, 3], [51, 36, 0.68187241405626497, 3], [54, 26, 0.73113811028371611, 3], [57, 43, 0.67340922287161242, 3], [60, 46, 0.82334871836145185, 6], [66, 36, 0.6580581781631849, 12], [78, 24, 0.6812455968723965, 3], [81, 24, 0.72390505378029368, 3], [84, 36, 0.81086632722879981, 6], [90, 44, 0.66906801328995646, 6], [96, 36, 0.76699447419334077, 3], [99, 26, 0.7330186837123307, 3], [102, 43, 0.74563268994297127, 3], [105, 46, 0.74176504016888722, 3], [108, 36, 0.8616703462140598, 6], [114, 24, 0.74786137093126803, 3], [117, 24, 0.66911309312650058, 3], [120, 36, 0.75034948834169379, 6], [126, 44, 0.71018078210400226, 3], [129, 36, 0.70183798240815087, 3], [132, 26, 0.83415853230865933, 6], [138, 43, 0.72578962060430929, 3], [141, 46, 0.71060221653616396, 3]],
+[[0, 31, 0.96542784331595743, 12], [12, 26, 0.87067247938038994, 3], [15, 24, 0.66401779230099056, 3], [18, 48, 0.69880020289757461, 12], [30, 32, 0.69171595681094333, 3], [33, 48, 0.70094088985511316, 3], [36, 31, 0.79738776716302062, 6], [42, 24, 0.71796274483245393, 12], [54, 26, 0.66158243839699749, 3], [57, 31, 0.7420639622600308, 3], [60, 26, 0.85314918570101739, 3], [63, 24, 0.70101750216660674, 3], [66, 48, 0.71645193469440749, 3], [69, 32, 0.67305259558254715, 3], [72, 48, 0.85240116079438266, 12], [84, 31, 0.81830149576320776, 3], [87, 24, 0.65388685799195689, 3], [90, 26, 0.67762848970134737, 12], [102, 31, 0.66384956572364828, 6], [108, 26, 0.87104818532365069, 12], [120, 24, 0.82592190154122591, 6], [126, 48, 0.73725416254133935, 3], [129, 32, 0.67854654499105327, 3], [132, 48, 0.84738866045578709, 3], [135, 31, 0.65367380991184354, 3], [138, 24, 0.66500541177793715, 3], [141, 26, 0.65591637322564367, 3], [144, 31, 0.8671078105575255, 3], [147, 26, 0.71415405591114578, 3], [150, 24, 0.74129039174474842, 3], [153, 48, 0.73043213963564924, 3]],
+[[0, 34, 0.93306849774480394, 3], [3, 26, 0.74389924397748142, 3], [6, 36, 0.70259617708168565, 3], [9, 44, 0.71099554222713968, 3], [12, 48, 0.75584192009825835, 6], [18, 41, 0.73819455213333318, 12], [30, 32, 0.68874352794321869, 3], [33, 43, 0.65349790081353976, 3], [36, 46, 0.78478386648358622, 3], [39, 34, 0.68563555575897661, 3], [42, 26, 0.68749379578998582, 3], [45, 36, 0.66621428925087545, 3], [48, 44, 0.80631038315076486, 3], [51, 48, 0.73839869262249669, 3], [54, 41, 0.7218621947806072, 12], [66, 32, 0.69549067158883193, 3], [69, 43, 0.72586812535028433, 3], [72, 46, 0.82843523835132071, 3], [75, 34, 0.66385996607503861, 3], [78, 26, 0.71924390782459147, 6], [84, 36, 0.8643122705720937, 6], [90, 44, 0.69596098323899502, 12], [102, 48, 0.67881701760834368, 3], [105, 41, 0.6740656203370391, 3], [108, 32, 0.77713400688746803, 3], [111, 43, 0.72042567506467659, 3], [114, 46, 0.66299263547593001, 6], [120, 34, 0.7711400180025928, 6], [126, 26, 0.66882604503784993, 6], [132, 36, 0.87706876804263567, 6], [138, 44, 0.70186304531239674, 6], [144, 48, 0.77648688963809276, 3], [147, 41, 0.65911195466649197, 3], [150, 32, 0.66226834432954984, 6], [156, 43, 0.85964773585449561, 3], [159, 46, 0.67038742151708652, 3], [162, 34, 0.66331990073290137, 6]],
+[[0, 43, 0.90664147192760403, 12], [12, 36, 0.79952726712850075, 3], [15, 36, 0.68558192316178446, 3], [18, 34, 0.69917146760668492, 6], [24, 46, 0.85255805955198571, 3], [27, 46, 0.74168743150396743, 3], [30, 46, 0.73443970527639713, 12], [42, 46, 0.68932574761938403, 6], [48, 46, 0.79373049646638427, 3], [51, 43, 0.67808816973563502, 3], [54, 36, 0.68525199331956321, 3], [57, 36, 0.69825902422093222, 3], [60, 34, 0.75954693700330367, 6], [66, 46, 0.67969727738305208, 6], [72, 46, 0.77443033649191118, 6], [78, 46, 0.74659144431576474, 12], [90, 46, 0.73134829201031859, 3], [93, 46, 0.74753221771174927, 3], [96, 43, 0.80586664077438475, 6], [102, 36, 0.65780858904927475, 3], [105, 36, 0.67552631139181885, 3], [108, 34, 0.84180279745963471, 3], [111, 46, 0.65713417743274738, 3], [114, 46, 0.736732334062141, 3], [117, 46, 0.65399027824636113, 3], [120, 46, 0.84772590011502735, 6], [126, 46, 0.73411222701899936, 6], [132, 43, 0.80006047667252211, 3], [135, 36, 0.70924971280541593, 3], [138, 36, 0.65900034511939087, 12], [150, 34, 0.69552556837490409, 3], [153, 46, 0.6729546286068333, 3], [156, 46, 0.82100778633617288, 6], [162, 46, 0.65360579958931941, 3], [165, 46, 0.72931502646591573, 3], [168, 46, 0.88153252924071035, 6], [174, 43, 0.68411262478542367, 6]],
+[[0, 36, 0.97845489568362931, 3], [3, 43, 0.73125567882132003, 3], [6, 43, 0.69999784120559672, 3], [9, 44, 0.70267003971250386, 3], [12, 24, 0.87973063928893946, 6], [18, 24, 0.72931337377297778, 3], [21, 43, 0.65566042287435122, 3], [24, 36, 0.87877625963396944, 3], [27, 36, 0.66966598508489872, 3], [30, 36, 0.65270846644541758, 3], [33, 43, 0.72884159680076344, 3], [36, 43, 0.87008875879423453, 3], [39, 44, 0.65764793319182624, 3], [42, 24, 0.66886538177213617, 6], [48, 24, 0.80756635302101754, 3], [51, 43, 0.70291327235943823, 3], [54, 36, 0.67814305974099431, 12], [66, 36, 0.7025410516766678, 3], [69, 36, 0.68687658945427787, 3], [72, 43, 0.83653698182410285, 6], [78, 43, 0.74880607623200934, 3], [81, 44, 0.66854817206348593, 3], [84, 24, 0.76598588922790611, 3], [87, 24, 0.74916771510856139, 3], [90, 43, 0.73254023054626449, 3], [93, 36, 0.67381498556189423, 3], [96, 36, 0.85858802556502289, 3], [99, 36, 0.7221239443500872, 3], [102, 43, 0.74599245462773256, 6], [108, 43, 0.81637567767558572, 6], [114, 44, 0.67073548261616578, 3], [117, 24, 0.71787559007408008, 3], [120, 24, 0.79353098610740702, 3], [123, 43, 0.69701026336316774, 3], [126, 36, 0.71973861435642295, 6], [132, 36, 0.86003150790852267, 6], [138, 36, 0.68419751384706384, 3], [141, 43, 0.6819861183006255, 3], [144, 43, 0.89650848323404442, 3], [147, 44, 0.67204674116811658, 3], [150, 24, 0.69689869465092735, 6], [156, 24, 0.78400166906312219, 6], [162, 43, 0.65969217648667067, 6], [168, 36, 0.86497713443635826, 3], [171, 36, 0.66933076119842261, 3], [174, 36, 0.72399491256618242, 3], [177, 43, 0.71407410668327287, 3], [180, 43, 0.83699679422133544, 6], [186, 44, 0.7118423810891551, 3], [189, 24, 0.66908571367439851, 3]]],
+61: [[[0, 31, 0.99851735977950673, 3], [3, 24, 0.70580912393691986, 3], [6, 26, 0.70457302615082384, 3], [9, 43, 0.73418437681674265, 3], [12, 48, 0.7625353123880696, 3], [15, 41, 0.7018653790798165, 3], [18, 43, 0.68938367311179305, 3], [21, 46, 0.74320442835965839, 3]],
+[[0, 26, 0.90876456195162358, 3], [3, 24, 0.66955702224632752, 3], [6, 44, 0.70304114313472243, 3], [9, 34, 0.7339580399675063, 3], [12, 46, 0.76477904444732592, 3], [15, 26, 0.71292504609563523, 3], [18, 24, 0.65378312465455024, 6], [24, 44, 0.84818887438316415, 3], [27, 34, 0.71423054314776091, 3], [30, 46, 0.67614034659764732, 6]],
+[[0, 36, 0.97954345067512949, 3], [3, 26, 0.66342001686621055, 3], [6, 24, 0.73990421863775024, 3], [9, 38, 0.71166826307081654, 3], [12, 24, 0.83723030510408714, 3], [15, 24, 0.6610436069686022, 3], [18, 26, 0.72261671710082853, 3], [21, 26, 0.68972541216839778, 3], [24, 29, 0.81527322800809243, 3], [27, 26, 0.69789256190350346, 3], [30, 36, 0.71872667736365747, 3], [33, 26, 0.69948555095823817, 3], [36, 24, 0.83087205648070228, 3], [39, 38, 0.7004492990969553, 3], [42, 24, 0.7249891819419273, 3], [45, 24, 0.71655955774579072, 3]],
+[[0, 36, 0.97332015779837888, 6], [6, 44, 0.66694284388058256, 3], [9, 44, 0.65685000351051492, 3], [12, 36, 0.76004002272580096, 3], [15, 46, 0.70433763221665269, 3], [18, 38, 0.70542166552203733, 3], [21, 26, 0.73644039204896183, 3], [24, 26, 0.85432915664547082, 3], [27, 24, 0.67773385468490743, 3], [30, 43, 0.68634994250555481, 3], [33, 36, 0.74101734297756472, 3], [36, 44, 0.81746109421506641, 12], [48, 44, 0.77473165951111944, 3], [51, 36, 0.74899338631982104, 3], [54, 46, 0.67778542449124746, 6]],
+[[0, 36, 0.95903451755152014, 3], [3, 24, 0.73278030003642736, 3], [6, 24, 0.70346694462365589, 12], [18, 46, 0.67743514393069615, 6], [24, 48, 0.84989613793009655, 3], [27, 38, 0.73871788959566587, 3], [30, 38, 0.68594231659974014, 3], [33, 46, 0.72271629674329063, 3], [36, 48, 0.76124379159498368, 3], [39, 38, 0.70644193351098827, 3], [42, 36, 0.72699553270336137, 12], [54, 24, 0.72084926809366157, 3], [57, 24, 0.73670002539055013, 3], [60, 46, 0.78257116177731312, 6], [66, 48, 0.70451959296038658, 3], [69, 38, 0.69155692621731846, 3]],
+[[0, 48, 0.92297868437535335, 3], [3, 46, 0.67707908194119804, 3], [6, 41, 0.68215150986870798, 6], [12, 46, 0.84015199321188905, 3], [15, 29, 0.69718414748368163, 3], [18, 41, 0.67116538451906882, 12], [30, 46, 0.6774648244958924, 3], [33, 29, 0.72472129379632799, 3], [36, 29, 0.78492969092219012, 6], [42, 36, 0.66584518187199038, 6], [48, 48, 0.79721329209022906, 3], [51, 46, 0.65738895690561783, 3], [54, 41, 0.70813436377123706, 12], [66, 46, 0.70870329814084987, 3], [69, 29, 0.66202104153935593, 3], [72, 41, 0.84775262232508553, 12]],
+[[0, 36, 0.95028741369132574, 3], [3, 26, 0.71145868170842264, 3], [6, 43, 0.72247169482483442, 6], [12, 44, 0.79129356773228099, 3], [15, 44, 0.67762983643470154, 3], [18, 48, 0.65845426976343691, 6], [24, 29, 0.80265164863551108, 3], [27, 43, 0.74745741160720924, 3], [30, 44, 0.65009520875997606, 3], [33, 44, 0.68466887908141971, 3], [36, 36, 0.89246293037921354, 6], [42, 26, 0.69218682249654817, 3], [45, 43, 0.66259788349916704, 3], [48, 44, 0.799623608978416, 6], [54, 44, 0.68030596051844372, 3], [57, 48, 0.72632804688972519, 3], [60, 29, 0.81671320508980227, 3], [63, 43, 0.74373476583153131, 3], [66, 44, 0.72451758280030465, 6], [72, 44, 0.86677679761023263, 3], [75, 36, 0.66144155023913631, 3], [78, 26, 0.67744069516362793, 6], [84, 43, 0.83125209822496393, 3], [87, 44, 0.68376740119069979, 3], [90, 44, 0.66455523911753445, 3], [93, 48, 0.74245906620961766, 3]],
+[[0, 34, 0.94675607912541471, 3], [3, 29, 0.66751617156867249, 3], [6, 29, 0.65891888509924501, 3], [9, 29, 0.71827214584442556, 3], [12, 43, 0.83365538538333017, 3], [15, 29, 0.65436404866591691, 3], [18, 29, 0.73395829703103799, 3], [21, 29, 0.70760862113339118, 3], [24, 43, 0.85881700726860788, 3], [27, 29, 0.65019703963970588, 3], [30, 34, 0.73555409466820953, 3], [33, 29, 0.72074844868676924, 3], [36, 29, 0.8713815530330058, 3], [39, 29, 0.67048921036741471, 3], [42, 43, 0.71463176375996351, 3], [45, 29, 0.6571743109201349, 3], [48, 29, 0.78145409363862273, 3], [51, 29, 0.71162120329963774, 3], [54, 43, 0.70672989237350026, 6], [60, 29, 0.76744838809926219, 3], [63, 34, 0.68035408064017755, 3], [66, 29, 0.71942915603442603, 3], [69, 29, 0.65321699917015119, 3], [72, 29, 0.88601570009198927, 3], [75, 43, 0.66210892236010499, 3], [78, 29, 0.68756807776516882, 3], [81, 29, 0.74381548166520617, 3], [84, 29, 0.83348877831409496, 3], [87, 43, 0.67425009832344374, 3], [90, 29, 0.72224993291237871, 3], [93, 34, 0.66423324834655439, 3], [96, 29, 0.82328223412815671, 3], [99, 29, 0.65404132947773996, 3], [102, 29, 0.69831822752766914, 3], [105, 43, 0.69884420524403956, 3]],
+[[0, 34, 0.94497862634720597, 3], [3, 26, 0.69728412414033958, 3], [6, 26, 0.66551491173706478, 6], [12, 26, 0.84264970149538554, 3], [15, 32, 0.74855872475349239, 3], [18, 26, 0.66520829339567178, 3], [21, 26, 0.66023784135984798, 3], [24, 26, 0.76108852065160726, 3], [27, 32, 0.71757222790144026, 3], [30, 26, 0.6749591121156886, 3], [33, 34, 0.68093274339028975, 3], [36, 26, 0.80043619542073507, 3], [39, 26, 0.74496110134219018, 3], [42, 26, 0.73823532771978806, 3], [45, 32, 0.69488274792241178, 3], [48, 26, 0.87698938512574953, 3], [51, 26, 0.73138903323754312, 3], [54, 26, 0.74880940106260907, 3], [57, 32, 0.66620317738028845, 3], [60, 26, 0.89817547068969916, 6], [66, 34, 0.74295461985462119, 3], [69, 26, 0.65282412239749787, 3], [72, 26, 0.8819208921790882, 6], [78, 26, 0.748830914219063, 3], [81, 32, 0.68375098806273193, 3], [84, 26, 0.89565988628562898, 3], [87, 26, 0.68434263823676844, 3], [90, 26, 0.72323843021760081, 6], [96, 32, 0.84234459588138499, 3], [99, 26, 0.74918595530226884, 3], [102, 34, 0.70504342210222903, 6], [108, 26, 0.8880359542830325, 6], [114, 26, 0.67601620002740648, 3], [117, 26, 0.723692012436292, 3]],
+[[0, 26, 0.91276084995405327, 3], [3, 26, 0.73288366382170933, 3], [6, 26, 0.67318573513755808, 3], [9, 24, 0.70538062715357674, 3], [12, 46, 0.88753356968650432, 12], [24, 26, 0.88676849535443736, 3], [27, 24, 0.74553024587223282, 3], [30, 46, 0.69951767525037079, 3], [33, 26, 0.72723963802205394, 3], [36, 24, 0.80775248427104784, 3], [39, 26, 0.73677537150693317, 3], [42, 26, 0.65345021049676899, 3], [45, 26, 0.65788466617126895, 3], [48, 24, 0.86095014722436169, 3], [51, 46, 0.65237740074469253, 3], [54, 26, 0.72335625113738067, 3], [57, 24, 0.74022901542739583, 3], [60, 46, 0.87843294486316159, 3], [63, 26, 0.70110453260349337, 3], [66, 24, 0.66511696138670251, 3], [69, 26, 0.722917288022904, 3], [72, 26, 0.83588577593956526, 3], [75, 26, 0.71751680262439166, 3], [78, 24, 0.73473257323300811, 3], [81, 46, 0.7070444398354635, 3], [84, 26, 0.76894281524276131, 6], [90, 24, 0.74031487711854171, 3], [93, 46, 0.71703390201221806, 3], [96, 26, 0.81067747545656721, 3], [99, 24, 0.66296539554780676, 3], [102, 26, 0.72173657717310624, 3], [105, 26, 0.7052136807060625, 3], [108, 26, 0.87006763169196333, 3], [111, 24, 0.70696534405786593, 3], [114, 46, 0.71810825503337239, 3], [117, 26, 0.71084694326717301, 3], [120, 24, 0.79430930779491138, 6], [126, 46, 0.65408944103482469, 3], [129, 26, 0.70305241596065005, 3]],
+[[0, 38, 0.90393022747088414, 3], [3, 32, 0.65012287486116482, 3], [6, 41, 0.69837871855735834, 3], [9, 46, 0.67856291761000065, 3], [12, 26, 0.89138510612608779, 6], [18, 24, 0.74701371784138793, 6], [24, 48, 0.81589995930052994, 6], [30, 36, 0.69511968638863098, 3], [33, 36, 0.67941212539748019, 3], [36, 31, 0.77031603079832955, 6], [42, 38, 0.67328271769132664, 3], [45, 32, 0.67449045449873768, 3], [48, 41, 0.86878396893065524, 3], [51, 46, 0.67916089721541462, 3], [54, 26, 0.66751511796930452, 3], [57, 24, 0.65516251534457715, 3], [60, 48, 0.80799900281736492, 3], [63, 36, 0.67586891926871728, 3], [66, 36, 0.69387935381350918, 3], [69, 31, 0.72005264453935192, 3], [72, 38, 0.75494459446625761, 6], [78, 32, 0.65396727981937852, 3], [81, 41, 0.65505355552087885, 3], [84, 46, 0.79988123573794123, 6], [90, 26, 0.68895490395896275, 6], [96, 24, 0.82954336650295812, 3], [99, 48, 0.70716338804962164, 3], [102, 36, 0.74719099793247101, 12], [114, 36, 0.67247109147314954, 6], [120, 31, 0.81181740134643388, 6], [126, 38, 0.70616879978879188, 3], [129, 32, 0.72128937501382628, 3], [132, 41, 0.76985427936339934, 3], [135, 46, 0.74377270909820825, 3], [138, 26, 0.72763857811911714, 3], [141, 24, 0.6877042483129201, 3]],
+[[0, 32, 0.97931472909186512, 6], [6, 29, 0.71306706667874808, 3], [9, 32, 0.68576955125031225, 3], [12, 44, 0.79991851645360168, 3], [15, 44, 0.67979283411989144, 3], [18, 26, 0.65689458724006278, 3], [21, 29, 0.74514479691793456, 3], [24, 32, 0.87119398627483313, 3], [27, 44, 0.6997230074758507, 3], [30, 44, 0.74386314075148552, 6], [36, 32, 0.87527894188020228, 12], [48, 29, 0.78579710802013869, 3], [51, 32, 0.65174615031964578, 3], [54, 44, 0.72021863635270078, 6], [60, 44, 0.82964499416641191, 6], [66, 26, 0.69777113330744511, 6], [72, 29, 0.87821223628551048, 6], [78, 32, 0.698655314708297, 3], [81, 44, 0.68718899379500498, 3], [84, 44, 0.78128338135643327, 3], [87, 32, 0.73441649689807054, 3], [90, 29, 0.67499829576152692, 12], [102, 32, 0.67201175275973835, 6], [108, 44, 0.76675260280518542, 6], [114, 44, 0.6788059080268013, 12], [126, 26, 0.74297523689208533, 6], [132, 29, 0.84549320745669665, 3], [135, 32, 0.74949160166202566, 3], [138, 44, 0.73810676830932975, 3], [141, 44, 0.65093217422489325, 3], [144, 32, 0.75420763512385958, 3], [147, 29, 0.7280870273118869, 3], [150, 32, 0.7239806295491632, 3], [153, 44, 0.66917272089810886, 3]],
+[[0, 38, 0.92372170367072759, 3], [3, 48, 0.68091440993037144, 3], [6, 34, 0.65166173668696892, 3], [9, 24, 0.65194426139935646, 3], [12, 44, 0.88633020644748917, 3], [15, 38, 0.71851448158011644, 3], [18, 48, 0.66079161065780401, 12], [30, 34, 0.67184123405936513, 3], [33, 24, 0.71797445655929815, 3], [36, 44, 0.84754861543977911, 3], [39, 38, 0.73878057098566385, 3], [42, 48, 0.72683986886609708, 3], [45, 34, 0.72217548926200048, 3], [48, 24, 0.77813773171867251, 3], [51, 44, 0.6539043713143009, 3], [54, 38, 0.73298694676843101, 3], [57, 48, 0.69175767143116207, 3], [60, 34, 0.81249273879036488, 3], [63, 24, 0.67075158710132476, 3], [66, 44, 0.69156020875726032, 3], [69, 38, 0.69279141016036583, 3], [72, 48, 0.76490259166864338, 3], [75, 34, 0.710057745193169, 3], [78, 24, 0.65395531917625305, 3], [81, 44, 0.69138680883694326, 3], [84, 38, 0.76205189797225004, 3], [87, 48, 0.69873302778624202, 3], [90, 34, 0.65594443528532631, 3], [93, 24, 0.69770247736595237, 3], [96, 44, 0.88204728252114739, 3], [99, 38, 0.68575644734700769, 3], [102, 48, 0.67497182129293298, 3], [105, 34, 0.6710743209755119, 3], [108, 24, 0.77846804361313682, 3], [111, 44, 0.74392404656699407, 3], [114, 38, 0.70932648930503639, 6], [120, 48, 0.7700303967283274, 3], [123, 34, 0.7454007213450482, 3], [126, 24, 0.67327017963678193, 3], [129, 44, 0.70589713283721045, 3], [132, 38, 0.880507910838077, 3], [135, 48, 0.68278958704276815, 3], [138, 34, 0.65619110687812288, 6], [144, 24, 0.76529663840128137, 3], [147, 44, 0.67855374283687064, 3], [150, 38, 0.65977189438115746, 6], [156, 48, 0.7517908529996038, 3], [159, 34, 0.7294196310392127, 3], [162, 24, 0.67662259882044884, 3], [165, 44, 0.74889355923330325, 3]],
+[[0, 46, 0.91762193749006549, 3], [3, 48, 0.70032015387768587, 3], [6, 32, 0.68636543809498951, 12], [18, 43, 0.72088760916536021, 6], [24, 46, 0.80513456623341983, 3], [27, 46, 0.70899637727095732, 3], [30, 46, 0.71093028496443378, 3], [33, 48, 0.73256620571156206, 3], [36, 32, 0.79645955879654295, 3], [39, 43, 0.65574477735219727, 3], [42, 46, 0.74945373945022598, 3], [45, 48, 0.7119573508758168, 3], [48, 32, 0.82376374737810765, 3], [51, 43, 0.72070078138378435, 3], [54, 46, 0.7173428852348378, 12], [66, 46, 0.66761392950937204, 6], [72, 46, 0.78154035076545969, 3], [75, 48, 0.70500474422730053, 3], [78, 32, 0.73591180417760116, 3], [81, 43, 0.73406955699554954, 3], [84, 46, 0.75179068985633235, 3], [87, 48, 0.67554147042505241, 3], [90, 32, 0.65253874611771767, 6], [96, 43, 0.78542675770944625, 6], [102, 46, 0.71533231834397415, 6], [108, 46, 0.8986158322314679, 3], [111, 46, 0.72751454153192063, 3], [114, 48, 0.67222036506267435, 3], [117, 32, 0.74842679613867014, 3], [120, 43, 0.84461456887311903, 3], [123, 46, 0.6938815301347836, 3], [126, 48, 0.68213616514221309, 12], [138, 32, 0.72417460293224345, 3], [141, 43, 0.73266095795444464, 3], [144, 46, 0.83810905578395123, 6], [150, 46, 0.73683858008856917, 6], [156, 46, 0.82167226614044386, 3], [159, 48, 0.7233680536045215, 3], [162, 32, 0.69441552632194525, 6], [168, 43, 0.8403550125625342, 3], [171, 46, 0.70790325265868592, 3], [174, 48, 0.74700495514609444, 3], [177, 32, 0.67822040124378946, 3]],
+[[0, 41, 0.90749112369152007, 6], [6, 44, 0.68508196767065499, 3], [9, 24, 0.66717388707033054, 3], [12, 24, 0.78750122741427653, 3], [15, 44, 0.68175269597842658, 3], [18, 24, 0.66704450201538978, 3], [21, 24, 0.66197590004638796, 3], [24, 44, 0.79387083714507367, 3], [27, 24, 0.7265095259828267, 3], [30, 24, 0.69664176362830887, 3], [33, 41, 0.66632996950197809, 3], [36, 44, 0.88865815727771846, 3], [39, 24, 0.73068655333518051, 3], [42, 24, 0.69988978292309578, 12], [54, 44, 0.72005706841248895, 3], [57, 24, 0.68224891301849977, 3], [60, 24, 0.85200725622729323, 3], [63, 44, 0.74944706921332382, 3], [66, 24, 0.66611908995459601, 3], [69, 24, 0.73708796669115784, 3], [72, 41, 0.83566638754822753, 3], [75, 44, 0.67968293794852408, 3], [78, 24, 0.66468795662074787, 3], [81, 24, 0.65696765683891378, 3], [84, 44, 0.79419235576389646, 3], [87, 24, 0.68099109416724579, 3], [90, 24, 0.69043795663447072, 3], [93, 44, 0.71400815090169212, 3], [96, 24, 0.7852518919608229, 3], [99, 24, 0.72155047953854523, 3], [102, 41, 0.71895551265217406, 3], [105, 44, 0.67267812617384704, 3], [108, 24, 0.88878494409916087, 12], [120, 24, 0.85630096458349636, 3], [123, 44, 0.70120192832100581, 3], [126, 24, 0.65664531103638279, 3], [129, 24, 0.72531067110367498, 3], [132, 44, 0.83619454871007504, 6], [138, 24, 0.74363823449954958, 12], [150, 24, 0.73659705693463506, 6], [156, 41, 0.80936672110417818, 3], [159, 44, 0.6527125079174031, 3], [162, 24, 0.73930231736876195, 12], [174, 24, 0.72892089801938209, 3], [177, 44, 0.68072925711402577, 3], [180, 24, 0.76243271274091484, 3], [183, 24, 0.71699422396049095, 3], [186, 44, 0.74550675874850303, 6]]]
+} \ No newline at end of file
diff --git a/Mini/miniTamTamMain.py b/Mini/miniTamTamMain.py
new file mode 100644
index 0000000..5230633
--- /dev/null
+++ b/Mini/miniTamTamMain.py
@@ -0,0 +1,800 @@
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+import gobject
+import os
+import random
+import time
+import xdrlib
+import commands
+
+import sugar.graphics.style as style
+
+from types import *
+from math import sqrt
+from common.Util.NoteDB import PARAMETER
+from common.port.scrolledbox import VScrolledBox
+
+import common.Util.Network as Net
+
+import common.Config as Config
+
+from Mini.miniToolbars import playToolbar
+from Mini.miniToolbars import recordToolbar
+from common.Util.ThemeWidgets import *
+from common.Util.CSoundNote import CSoundNote
+from common.Util import NoteDB
+from common.Util.NoteDB import Note
+from common.Util.CSoundClient import new_csound_client
+from common.Util.LoopSettings import LoopSettings
+from common.Util import InstrumentDB
+from common.Util.Instruments import DRUMCOUNT
+
+from Fillin import Fillin
+from KeyboardStandAlone import KeyboardStandAlone
+from MiniSequencer import MiniSequencer
+from Loop import Loop
+from RythmGenerator import *
+from common.Util.Trackpad import Trackpad
+from Mini.InstrumentPanel import InstrumentPanel
+from common.Util import OS
+
+from gettext import gettext as _
+
+Tooltips = Config.Tooltips
+
+class miniTamTamMain(gtk.EventBox):
+
+ def __init__(self, activity):
+ gtk.EventBox.__init__(self)
+
+ self.instrumentPanel = None
+ self.activity = activity
+
+ #self.set_border_width(Config.MAIN_WINDOW_PADDING)
+ #self.set_border_width(0)
+
+ self.instrumentDB = InstrumentDB.getRef()
+ self.firstTime = False
+ self.playing = False
+ self.csnd = new_csound_client()
+ self.timeout_ms = 50
+ self.instVolume = 50
+ self.drumVolume = 0.5
+ self.instrument = 'ocarina'
+ self.regularity = 0.75
+ self.beat = 4
+ self.reverb = 0.1
+ self.tempo = Config.PLAYER_TEMPO
+ self.beatDuration = 60.0/self.tempo
+ self.ticksPerSecond = Config.TICKS_PER_BEAT*self.tempo/60.0
+ self.rythmInstrument = 'drum1kit'
+ self.csnd.load_drumkit(self.rythmInstrument)
+ self.muteInst = False
+ self.drumFillin = Fillin( self.beat, self.tempo, self.rythmInstrument, self.reverb, self.drumVolume )
+ self.sequencer= MiniSequencer(self.recordStateButton, self.recordOverSensitivity)
+ self.loop = Loop(self.beat, sqrt( self.instVolume*0.01 ))
+ self.csnd.setTempo(self.tempo)
+ self.noteList = []
+ time.sleep(0.001) # why?
+ self.trackpad = Trackpad( self )
+ for i in range(21):
+ self.csnd.setTrackVolume( 100, i )
+
+ for i in range(10):
+ r = str(i+1)
+ self.csnd.load_instrument('guidice' + r)
+
+ self.volume = 100
+ self.csnd.setMasterVolume(self.volume)
+ self.sequencer.beat = self.beat
+ self.loop.beat = self.beat
+ self.tooltips = gtk.Tooltips()
+
+ self.masterVBox = gtk.VBox()
+ self.mainWindowBox = gtk.HBox()
+ self.leftBox = gtk.VBox()
+ self.rightBox = gtk.VBox()
+ self.mainWindowBox.pack_start(self.rightBox, False, True)
+ self.mainWindowBox.pack_start(self.leftBox, True, True)
+ self.masterVBox.pack_start(self.mainWindowBox)
+ self.add(self.masterVBox)
+
+ self.enableKeyboard()
+ self.setInstrument(self.instrument)
+
+ self.connect('key-press-event', self.onKeyPress)
+ self.connect('key-release-event', self.onKeyRelease)
+
+ self.drawGeneration()
+ self.show_all()
+ if 'a good idea' == True:
+ self.playStartupSound()
+
+ self.beatPickup = True
+ #self.regenerate()
+
+ self.heartbeatStart = time.time()
+ self.syncQueryStart = {}
+ self.syncTimeout = None
+
+ self.network = Net.Network()
+ self.network.addWatcher( self.networkStatusWatcher )
+ self.network.connectMessage( Net.HT_SYNC_REPLY, self.processHT_SYNC_REPLY )
+ self.network.connectMessage( Net.HT_TEMPO_UPDATE, self.processHT_TEMPO_UPDATE )
+ self.network.connectMessage( Net.PR_SYNC_QUERY, self.processPR_SYNC_QUERY )
+ self.network.connectMessage( Net.PR_TEMPO_QUERY, self.processPR_TEMPO_QUERY )
+ self.network.connectMessage( Net.PR_REQUEST_TEMPO_CHANGE, self.processPR_REQUEST_TEMPO_CHANGE )
+
+ # data packing classes
+ self.packer = xdrlib.Packer()
+ self.unpacker = xdrlib.Unpacker("")
+
+ #-- handle forced networking ---------------------------------------
+ if self.network.isHost():
+ self.updateSync()
+ self.syncTimeout = gobject.timeout_add( 1000, self.updateSync )
+ elif self.network.isPeer():
+ self.sendTempoQuery()
+ self.syncTimeout = gobject.timeout_add( 1000, self.updateSync )
+ #-------------------------------------------------------------------
+
+ # Toolbar
+ self.activity.activity_toolbar.share.show()
+ self._playToolbar = playToolbar(self.activity.toolbox, self)
+
+ ## set to 1 to show play and record tabs ##
+ if 0:
+ self._recordToolbar = recordToolbar(self.activity.toolbox, self)
+ self.activity.toolbox.add_toolbar(_('Play'), self._playToolbar)
+ self.activity.toolbox.add_toolbar(_('Record'), self._recordToolbar)
+ self.activity.toolbox.set_current_toolbar(1)
+ self._playToolbar.show()
+ self._recordToolbar.show()
+
+ self.activity.connect( "shared", self.shared )
+
+ if os.path.isfile("FORCE_SHARE"): # HOST
+ r = random.random()
+ #print "::::: Sharing as TTDBG%f :::::" % r
+ #self.activity.set_title(_("TTDBG%f" % r))
+ print "::::: Sharing as TamTam :::::"
+ self.activity.set_title(_("TamTam"))
+ self.activity.share()
+ elif self.activity._shared_activity: # PEER
+ self.activity._shared_activity.connect( "buddy-joined", self.buddy_joined )
+ self.activity._shared_activity.connect( "buddy-left", self.buddy_left )
+ self.activity.connect( "joined", self.joined )
+ self.network.setMode( Net.MD_WAIT )
+ #self.activity.activity_toolbar.share.hide()
+
+ def drawGeneration( self ):
+
+ slidersBox = RoundVBox(fillcolor = Config.PANEL_COLOR, bordercolor = Config.PANEL_BCK_COLOR, radius = Config.PANEL_RADIUS)
+ slidersBox.set_border_width(Config.PANEL_SPACING)
+
+ geneSliderBox = gtk.VBox()
+ self.geneSliderBoxImgTop = gtk.Image()
+ self.geneSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'complex6.png')
+ self.geneAdjustment = gtk.Adjustment(value=self.regularity, lower=0, upper=1, step_incr=0.01, page_incr=0, page_size=0)
+ self.geneSlider = ImageVScale( Config.IMAGE_ROOT + "sliderbutbleu.png", self.geneAdjustment, 5 )
+ self.geneSlider.set_inverted(False)
+ self.geneSlider.set_size_request(15,-1)
+ self.geneAdjustment.connect("value_changed" , self.handleGenerationSlider)
+ self.geneSlider.connect("button-release-event", self.handleGenerationSliderRelease)
+ geneSliderBox.pack_start(self.geneSliderBoxImgTop, False, padding=10)
+ geneSliderBox.pack_start(self.geneSlider, True, 20)
+ self.tooltips.set_tip(self.geneSlider,Tooltips.COMPL)
+
+ beatSliderBox = gtk.VBox()
+ self.beatSliderBoxImgTop = gtk.Image()
+ self.beatSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'beat3.png')
+ self.beatAdjustment = gtk.Adjustment(value=self.beat, lower=2, upper=12, step_incr=1, page_incr=0, page_size=0)
+ self.beatSlider = ImageVScale( Config.IMAGE_ROOT + "sliderbutjaune.png", self.beatAdjustment, 5, snap = 1 )
+ self.beatSlider.set_inverted(True)
+ self.beatSlider.set_size_request(15,-1)
+ self.beatAdjustment.connect("value_changed" , self.handleBeatSlider)
+ self.beatSlider.connect("button-release-event", self.handleBeatSliderRelease)
+ beatSliderBox.pack_start(self.beatSliderBoxImgTop, False, padding=10)
+ beatSliderBox.pack_start(self.beatSlider, True, 20)
+ self.tooltips.set_tip(self.beatSlider,Tooltips.BEAT)
+
+ self.delayedTempo = 0 # used to store tempo updates while the slider is active
+ self.tempoSliderActive = False
+
+ tempoSliderBox = gtk.VBox()
+ self.tempoSliderBoxImgTop = gtk.Image()
+ self.tempoSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'tempo5.png')
+ self.tempoAdjustment = gtk.Adjustment(value=self.tempo, lower=Config.PLAYER_TEMPO_LOWER, upper=Config.PLAYER_TEMPO_UPPER, step_incr=1, page_incr=1, page_size=1)
+ tempoSlider = ImageVScale( Config.IMAGE_ROOT + "sliderbutvert.png", self.tempoAdjustment, 5)
+ tempoSlider.set_inverted(True)
+ tempoSlider.set_size_request(15,-1)
+ self.tempoAdjustmentHandler = self.tempoAdjustment.connect("value_changed" , self.handleTempoSliderChange)
+ tempoSlider.connect("button-press-event", self.handleTempoSliderPress)
+ tempoSlider.connect("button-release-event", self.handleTempoSliderRelease)
+ tempoSliderBox.pack_start(self.tempoSliderBoxImgTop, False, padding=10)
+ tempoSliderBox.pack_start(tempoSlider, True)
+ self.tooltips.set_tip(tempoSlider,Tooltips.TEMPO)
+
+ volumeSliderBox = gtk.VBox()
+ self.volumeSliderBoxImgTop = gtk.Image()
+ self.volumeSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'volume2.png')
+ self.volumeAdjustment = gtk.Adjustment(value=self.volume, lower=0, upper=200, step_incr=1, page_incr=1, page_size=1)
+ volumeSlider = ImageVScale( Config.IMAGE_ROOT + "sliderbutbleu.png", self.volumeAdjustment, 5)
+ volumeSlider.set_inverted(True)
+ volumeSlider.set_size_request(15,-1)
+ self.volumeAdjustment.connect("value_changed" , self.handleVolumeSlider)
+ #volumeSlider.connect("button-release-event", self.handleVolumeSliderRelease)
+ volumeSliderBox.pack_start(self.volumeSliderBoxImgTop, False, padding=10)
+ volumeSliderBox.pack_start(volumeSlider, True)
+ self.tooltips.set_tip(volumeSlider,Tooltips.VOL)
+
+
+ slidersBoxSub = gtk.HBox()
+ slidersBoxSub.pack_start(beatSliderBox)
+ slidersBoxSub.pack_start(geneSliderBox)
+ slidersBoxSub.pack_start(tempoSliderBox)
+ slidersBoxSub.pack_start(volumeSliderBox)
+ slidersBox.pack_start(slidersBoxSub)
+
+ generateBtnSub = RoundHBox(
+ fillcolor=Config.PANEL_COLOR,
+ bordercolor=Config.PANEL_BCK_COLOR,
+ radius=Config.PANEL_RADIUS)
+ generateBtnSub.set_border_width(Config.PANEL_SPACING)
+
+ #playImg = gtk.Image()
+ #playImg.set_from_icon_name('media-playback-start', gtk.ICON_SIZE_LARGE_TOOLBAR)
+ self.playButton = ImageToggleButton(Config.IMAGE_ROOT + 'miniplay.png', Config.IMAGE_ROOT + 'stop.png')
+ #self.playButton.set_relief(gtk.RELIEF_NONE)
+ #self.playButton.set_image(playImg)
+ self.playButton.connect('clicked',self.handlePlayButton)
+ generateBtnSub.pack_start(self.playButton)
+ #self.playButton.set_tooltip(_('Play / Stop'))
+
+ generateBtn = ImageButton(Config.IMAGE_ROOT + 'dice.png', clickImg_path = Config.IMAGE_ROOT + 'diceblur.png')
+ generateBtn.connect('button-press-event', self.handleGenerateBtn)
+ generateBtnSub.pack_start(generateBtn)
+ self.tooltips.set_tip(generateBtn,Tooltips.GEN)
+
+ # drums
+
+ drum_box = RoundVBox(
+ fillcolor=Config.PANEL_COLOR,
+ bordercolor=Config.PANEL_BCK_COLOR,
+ radius=Config.PANEL_RADIUS)
+ drum_box.set_border_width(Config.PANEL_SPACING)
+
+ drum_scroll = VScrolledBox(scroll_policy=gtk.POLICY_NEVER)
+ drum_scroll.set_viewport(drum_box)
+ drum_scroll.modify_bg(gtk.STATE_NORMAL,
+ style.Color(Config.PANEL_BCK_COLOR).get_gdk_color())
+ drum_i = 0
+ drum_group = None
+
+ for row in range(DRUMCOUNT/2 + DRUMCOUNT%2):
+ row_box = gtk.HBox()
+ drum_box.pack_start(row_box, False)
+
+ for col in range(2):
+ if drum_i >= DRUMCOUNT:
+ break
+
+ drum = ImageRadioButton(
+ group=drum_group,
+ mainImg_path=Config.IMAGE_ROOT + \
+ ('drum%dkit.png' % (drum_i+1)),
+ altImg_path=Config.IMAGE_ROOT + \
+ ('drum%dkitselgen.png' % (drum_i+1)))
+ drum.connect('clicked', self.handleGenerationDrumBtn,
+ 'drum%dkit' % (drum_i+1))
+ row_box.pack_start(drum)
+
+ hint = self.instrumentDB.instNamed['drum%dkit' % (drum_i + 1)].nameTooltip
+ self.tooltips.set_tip(drum, hint)
+
+ if not drum_group:
+ drum_group = drum
+ drum_i += 1
+
+ self.rightBox.pack_start(slidersBox, False)
+ self.rightBox.pack_start(generateBtnSub, False)
+ self.rightBox.pack_start(drum_scroll)
+
+ drum_size = drum_group.get_size_request()
+ slidersBox.set_size_request(-1, drum_size[1]*2)
+ self.rightBox.set_size_request(drum_size[0]*2, -1)
+
+ def loopSettingsChannel(self, channel, value):
+ self.csnd.setChannel(channel, value)
+
+ def loopSettingsPlayStop(self, state, loop):
+ if not state:
+ if loop:
+ self.loopSettingsPlaying = True
+ self.csnd.inputMessage(Config.CSOUND_PLAY_LS_NOTE % 5022)
+ else:
+ self.csnd.inputMessage(Config.CSOUND_PLAY_LS_NOTE % 5023)
+ else:
+ if loop:
+ self.loopSettingsPlaying = False
+ self.csnd.inputMessage(Config.CSOUND_STOP_LS_NOTE)
+
+ def load_ls_instrument(self, soundName):
+ self.csnd.load_ls_instrument(soundName)
+
+ def updateInstrumentPanel(self):
+ if self.instrumentPanel is None:
+ self.instrumentPanel = InstrumentPanel()
+ self.leftBox.pack_start(self.instrumentPanel)
+
+ width = gtk.gdk.screen_width() - self.rightBox.get_size_request()[0]
+ self.instrumentPanel.configure(self.setInstrument,
+ self.playInstrumentNote, False, self.micRec, width=width)
+
+ self.instrumentPanel.load()
+
+ def micRec(self, widget, mic):
+ self.csnd.inputMessage("i5600 0 4")
+ OS.arecord(4, "crop.csd", mic)
+ self.micTimeout = gobject.timeout_add(200, self.loadMicInstrument, mic)
+ self.instrumentPanel.set_activeInstrument(mic,True)
+ self.setInstrument(mic)
+
+ def recordStateButton( self, button, state ):
+ if button == 1:
+ self._recordToolbar.keyboardRecButton.set_active( state )
+ else:
+ self._recordToolbar.keyboardRecOverButton.set_active( state )
+
+ def recordOverSensitivity( self, state ):
+ pass
+ #self._recordToolbar.keyboardRecOverButton.set_sensitive( state )
+
+ def loadMicInstrument( self, data ):
+ self.csnd.load_mic_instrument( data )
+
+ def regenerate(self):
+ def flatten(ll):
+ rval = []
+ for l in ll:
+ rval += l
+ return rval
+ if self.beatPickup:
+ self.pickupNewBeat()
+ noteOnsets = []
+ notePitchs = []
+ i = 0
+ self.noteList= []
+ self.csnd.loopClear()
+ for x in flatten( generator(self.rythmInstrument, self.beat, 0.8, self.regularity, self.reverb) ):
+ x.amplitude = x.amplitude * self.drumVolume
+ noteOnsets.append(x.onset)
+ notePitchs.append(x.pitch)
+ n = Note(0, x.trackId, i, x)
+ self.noteList.append( (x.onset, n) )
+ i = i + 1
+ self.csnd.loopPlay(n,1) #add as active
+ self.csnd.loopSetNumTicks( self.beat * Config.TICKS_PER_BEAT)
+ self.drumFillin.unavailable( noteOnsets, notePitchs )
+ self.recordOverSensitivity( False )
+ if self.playing:
+ self.csnd.loopStart()
+
+ def adjustDrumVolume(self):
+ for n in self.noteList:
+ self.csnd.loopUpdate(n[1], PARAMETER.AMPLITUDE, n[1].cs.amplitude*self.drumVolume, 1)
+
+ def handleClose(self,widget):
+ if self.playStopButton.get_active() == True:
+ self.playStopButton.set_active(False)
+ self.sequencer.clearSequencer()
+ self.csnd.loopClear()
+ self.activity.close()
+
+ def handleGenerationSlider(self, adj):
+ img = int(adj.value * 7)+1
+ self.geneSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'complex' + str(img) + '.png')
+
+ def handleGenerationSliderRelease(self, widget, event):
+ self.regularity = widget.get_adjustment().value
+ self.beatPickup = False
+ self.regenerate()
+ self.beatPickup = True
+
+ def pickupNewBeat(self):
+ self.beat = random.randint(2, 12)
+ img = self.scale(self.beat,2,12,1,11)
+ self.beatSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'beat' + str(img) + '.png')
+ self.beatAdjustment.set_value(self.beat)
+
+ self.regularity = random.randint(50, 100) * 0.01
+ img = int(self.regularity * 7)+1
+ self.geneSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'complex' + str(img) + '.png')
+ self.geneAdjustment.set_value(self.regularity)
+
+ self.sequencer.beat = self.beat
+ self.loop.beat = self.beat
+ self.drumFillin.setBeats( self.beat )
+
+ def handleBeatSlider(self, adj):
+ img = self.scale(int(adj.value),2,12,1,11)
+ self.beatSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'beat' + str(img) + '.png')
+ self.sequencer.beat = self.beat
+ self.loop.beat = self.beat
+ self.drumFillin.setBeats( self.beat )
+
+ def handleBeatSliderRelease(self, widget, event):
+ self.beat = int(widget.get_adjustment().value)
+ self.sequencer.beat = self.beat
+ self.loop.beat = self.beat
+ self.drumFillin.setBeats( self.beat )
+ self.beatPickup = False
+ self.regenerate()
+ self.beatPickup = True
+
+ def handleTempoSliderPress(self, widget, event):
+ self.tempoSliderActive = True
+
+ def handleTempoSliderRelease(self, widget, event):
+ self.tempoSliderActive = False
+ if self.network.isPeer() and self.delayedTempo != 0:
+ if self.tempo != self.delayedTempo:
+ self.tempoAdjustment.handler_block( self.tempoAdjustmentHandler )
+ self.tempoAdjustment.set_value( self.delayedTempo )
+ self._updateTempo( self.delayedTempo )
+ self.tempoAdjustment.handler_unblock( self.tempoAdjustmentHandler )
+ self.delayedTempo = 0
+ self.sendSyncQuery()
+
+ def handleTempoSliderChange(self,adj):
+ if self.network.isPeer():
+ self.requestTempoChange(int(adj.value))
+ else:
+ self._updateTempo( int(adj.value) )
+
+ def _updateTempo( self, val ):
+
+ if self.network.isHost():
+ t = time.time()
+ percent = self.heartbeatElapsed() / self.beatDuration
+
+ self.tempo = val
+ self.beatDuration = 60.0/self.tempo
+ self.ticksPerSecond = Config.TICKS_PER_BEAT*self.tempo/60.0
+ self.csnd.setTempo(self.tempo)
+ self.sequencer.tempo = self.tempo
+ self.drumFillin.setTempo(self.tempo)
+
+ if self.network.isHost():
+ self.heatbeatStart = t - percent*self.beatDuration
+ self.updateSync()
+ self.sendTempoUpdate()
+
+ img = int(self.scale( self.tempo,
+ Config.PLAYER_TEMPO_LOWER,Config.PLAYER_TEMPO_UPPER,
+ 1,9))
+ self.tempoSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'tempo' + str(img) + '.png')
+
+ def handleBalanceSlider(self, adj):
+ self.instVolume = int(adj.value)
+ self.drumVolume = sqrt( (100-self.instVolume)*0.01 )
+ self.adjustDrumVolume()
+ self.drumFillin.setVolume(self.drumVolume)
+ instrumentVolume = sqrt( self.instVolume*0.01 )
+ self.loop.adjustLoopVolume(instrumentVolume)
+ self.sequencer.adjustSequencerVolume(instrumentVolume)
+ img = int(self.scale(self.instVolume,100,0,0,4.9))
+ self._playToolbar.balanceSliderImgLeft.set_from_file(Config.IMAGE_ROOT + 'dru' + str(img) + '.png')
+ img2 = int(self.scale(self.instVolume,0,100,0,4.9))
+ self._playToolbar.balanceSliderImgRight.set_from_file(Config.IMAGE_ROOT + 'instr' + str(img2) + '.png')
+
+ def handleReverbSlider(self, adj):
+ self.reverb = adj.value
+ self.drumFillin.setReverb( self.reverb )
+ img = int(self.scale(self.reverb,0,1,0,4))
+ self._playToolbar.reverbSliderImgRight.set_from_file(Config.IMAGE_ROOT + 'reverb' + str(img) + '.png')
+ self.keyboardStandAlone.setReverb(self.reverb)
+
+ def handleVolumeSlider(self, adj):
+ self.volume = adj.value
+ self.csnd.setMasterVolume(self.volume)
+ img = int(self.scale(self.volume,0,200,0,3.9))
+ self.volumeSliderBoxImgTop.set_from_file(Config.IMAGE_ROOT + 'volume' + str(img) + '.png')
+
+ def handlePlayButton(self, widget, data = None):
+ # use widget.get_active() == False when calling this on 'clicked'
+ # use widget.get_active() == True when calling this on button-press-event
+ if widget.get_active() == False:
+ self.drumFillin.stop()
+ self.sequencer.stopPlayback()
+ self.csnd.loopPause()
+ self.playing = False
+ else:
+ if not self.firstTime:
+ self.regenerate()
+ self.firstTime = True
+ self.drumFillin.play()
+ #self.csnd.loopSetTick(0)
+ nextInTicks = self.nextHeartbeatInTicks()
+ #print "play:: next beat in %f ticks. bpb == %d. setting ticks to %d" % (nextInTicks, self.beat, Config.TICKS_PER_BEAT*self.beat - int(round(nextInTicks)))
+ self.csnd.loopSetTick( Config.TICKS_PER_BEAT*self.beat - int(round(nextInTicks)) )
+ self.csnd.loopStart()
+ self.playing = True
+
+
+ def handleGenerationDrumBtn(self , widget , data):
+ #data is drum1kit, drum2kit, or drum3kit
+ #print 'HANDLE: Generate Button'
+ self.rythmInstrument = data
+ self.csnd.load_drumkit(data)
+ instrumentId = self.instrumentDB.instNamed[data].instrumentId
+ for (o,n) in self.noteList :
+ self.csnd.loopUpdate(n, NoteDB.PARAMETER.INSTRUMENT, instrumentId, -1)
+ self.drumFillin.setInstrument( self.rythmInstrument )
+
+ def handleGenerateBtn(self , widget , data=None):
+ self.regenerate()
+ if not self.playButton.get_active():
+ self.playButton.set_active(True)
+
+ #this calls sends a 'clicked' event,
+ #which might be connected to handlePlayButton
+ self.playStartupSound()
+
+ def enableKeyboard( self ):
+ self.keyboardStandAlone = KeyboardStandAlone( self.sequencer.recording, self.sequencer.adjustDuration, self.csnd.loopGetTick, self.sequencer.getPlayState, self.loop )
+ self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
+
+ def setInstrument( self , instrument ):
+ self.instrument = instrument
+ self.keyboardStandAlone.setInstrument(instrument)
+ self.csnd.load_instrument(instrument)
+
+ def playInstrumentNote(self , instrument, secs_per_tick = 0.025):
+ if not self.muteInst:
+ self.csnd.play(
+ CSoundNote( onset = 0,
+ pitch = 36,
+ amplitude = 1,
+ pan = 0.5,
+ duration = 20,
+ trackId = 1,
+ instrumentId = self.instrumentDB.instNamed[instrument].instrumentId,
+ reverbSend = self.reverb,
+ tied = False,
+ mode = 'mini'),
+ secs_per_tick)
+
+ def onKeyPress(self, widget, event):
+ if event.hardware_keycode == 219: #'/*' button to reset drum loop
+ if self.playStopButton.get_active() == True:
+ self.handlePlayButton(self.playStopButton)
+ self.playStopButton.set_active(False)
+ self.handlePlayButton(self.playStopButton)
+ self.playStopButton.set_active(True)
+
+ if event.hardware_keycode == 37:
+ if self.muteInst:
+ self.muteInst = False
+ else:
+ self.muteInst = True
+
+ if event.hardware_keycode == 65: #what key is this? what feature is this?
+ pass
+ #if self.playStopButton.get_active():
+ #self.playStopButton.set_active(False)
+ #else:
+ #self.playStopButton.set_active(True)
+
+ self.keyboardStandAlone.onKeyPress(widget, event, sqrt( self.instVolume*0.01 ))
+
+ def onKeyRelease(self, widget, event):
+ self.keyboardStandAlone.onKeyRelease(widget, event)
+
+ def playStartupSound(self):
+ r = str(random.randrange(1,11))
+ self.playInstrumentNote('guidice' + r)
+
+ def onActivate( self, arg ):
+ self.csnd.loopPause()
+ self.csnd.loopClear()
+
+ def onDeactivate( self ):
+ SubActivity.onDeactivate( self )
+ self.csnd.loopPause()
+ self.csnd.loopClear()
+
+ def onDestroy( self ):
+ self.network.shutdown()
+
+ def scale(self, input,input_min,input_max,output_min,output_max):
+ range_input = input_max - input_min
+ range_output = output_max - output_min
+ result = (input - input_min) * range_output / range_input + output_min
+
+ if (input_min > input_max and output_min > output_max) or (output_min > output_max and input_min < input_max):
+ if result > output_min:
+ return output_min
+ elif result < output_max:
+ return output_max
+ else:
+ return result
+
+ if (input_min < input_max and output_min < output_max) or (output_min < output_max and input_min > input_max):
+ if result > output_max:
+ return output_max
+ elif result < output_min:
+ return output_min
+ else:
+ return result
+
+
+ #-----------------------------------------------------------------------
+ # Network
+
+ #-- Activity -----------------------------------------------------------
+
+ def shared( self, activity ):
+ if Config.DEBUG: print "miniTamTam:: successfully shared, start host mode"
+ self.activity._shared_activity.connect( "buddy-joined", self.buddy_joined )
+ self.activity._shared_activity.connect( "buddy-left", self.buddy_left )
+ self.network.setMode( Net.MD_HOST )
+ self.updateSync()
+ self.syncTimeout = gobject.timeout_add( 1000, self.updateSync )
+
+ def joined( self, activity ):
+ print "miniTamTam:: joined activity!!"
+ for buddy in self.activity._shared_activity.get_joined_buddies():
+ print buddy.props.ip4_address
+
+ def buddy_joined( self, activity, buddy ):
+ print "buddy joined " + str(buddy)
+ try:
+ print buddy.props.ip4_address
+ except:
+ print "bad ip4_address"
+ if self.network.isHost():
+ # TODO how do I figure out if this buddy is me?
+ if buddy.props.ip4_address:
+ self.network.introducePeer( buddy.props.ip4_address )
+ else:
+ print "miniTamTam:: new buddy does not have an ip4_address!!"
+
+ def buddy_left( self, activity, buddy):
+ print "buddy left"
+
+ #def joined( self, activity ):
+ # if Config.DEBUG: print "miniTamTam:: successfully joined, wait for host"
+ # self.net.waitForHost()
+
+ #-- Senders ------------------------------------------------------------
+
+ def sendSyncQuery( self ):
+ self.packer.pack_float(random.random())
+ hash = self.packer.get_buffer()
+ self.packer.reset()
+ self.syncQueryStart[hash] = time.time()
+ self.network.send( Net.PR_SYNC_QUERY, hash)
+
+ def sendTempoUpdate( self ):
+ self.packer.pack_int(self.tempo)
+ self.network.sendAll( Net.HT_TEMPO_UPDATE, self.packer.get_buffer() )
+ self.packer.reset()
+
+ def sendTempoQuery( self ):
+ self.network.send( Net.PR_TEMPO_QUERY )
+
+ def requestTempoChange( self, val ):
+ self.packer.pack_int(val)
+ self.network.send( Net.PR_REQUEST_TEMPO_CHANGE, self.packer.get_buffer() )
+ self.packer.reset()
+
+ #-- Handlers -----------------------------------------------------------
+
+ def networkStatusWatcher( self, mode ):
+ if mode == Net.MD_OFFLINE:
+ if self.syncTimeout:
+ gobject.source_remove( self.syncTimeout )
+ self.syncTimeout = None
+ if mode == Net.MD_PEER:
+ self.updateSync()
+ if not self.syncTimeout:
+ self.syncTimeout = gobject.timeout_add( 1000, self.updateSync )
+ self.sendTempoQuery()
+
+ def processHT_SYNC_REPLY( self, sock, message, data ):
+ t = time.time()
+ hash = data[0:4]
+ latency = t - self.syncQueryStart[hash]
+ self.unpacker.reset(data[4:8])
+ nextBeat = self.unpacker.unpack_float()
+ #print "mini:: got sync: next beat in %f, latency %d" % (nextBeat, latency*1000)
+ self.heartbeatStart = t + nextBeat - self.beatDuration - latency/2
+ self.correctSync()
+ self.syncQueryStart.pop(hash)
+
+ def processHT_TEMPO_UPDATE( self, sock, message, data ):
+ self.unpacker.reset(data)
+ val = self.unpacker.unpack_int()
+ if self.tempoSliderActive:
+ self.delayedTempo = val
+ return
+ self.tempoAdjustment.handler_block( self.tempoAdjustmentHandler )
+ self.tempoAdjustment.set_value( val )
+ self._updateTempo( val )
+ self.tempoAdjustment.handler_unblock( self.tempoAdjustmentHandler )
+ self.sendSyncQuery()
+
+ def processPR_SYNC_QUERY( self, sock, message, data ):
+ self.packer.pack_float(self.nextHeartbeat())
+ self.network.send( Net.HT_SYNC_REPLY, data + self.packer.get_buffer(), sock )
+ self.packer.reset()
+
+ def processPR_TEMPO_QUERY( self, sock, message, data ):
+ self.packer.pack_int(self.tempo)
+ self.network.send( Net.HT_TEMPO_UPDATE, self.packer.get_buffer(), to = sock )
+ self.packer.reset()
+
+ def processPR_REQUEST_TEMPO_CHANGE( self, sock, message, data ):
+ if self.tempoSliderActive:
+ return
+ self.unpacker.reset(data)
+ val = self.unpacker.unpack_int()
+ self.tempoAdjustment.set_value( val )
+
+ #-----------------------------------------------------------------------
+ # Sync
+
+ def nextHeartbeat( self ):
+ delta = time.time() - self.heartbeatStart
+ return self.beatDuration - (delta % self.beatDuration)
+
+ def nextHeartbeatInTicks( self ):
+ delta = time.time() - self.heartbeatStart
+ next = self.beatDuration - (delta % self.beatDuration)
+ return self.ticksPerSecond*next
+
+ def heartbeatElapsed( self ):
+ delta = time.time() - self.heartbeatStart
+ return delta % self.beatDuration
+
+ def heartbeatElapsedTicks( self ):
+ delta = time.time() - self.heartbeatStart
+ return self.ticksPerSecond*(delta % self.beatDuration)
+
+ def updateSync( self ):
+ if self.network.isOffline():
+ return False
+ elif self.network.isWaiting():
+ return True
+ elif self.network.isHost():
+ self.correctSync()
+ else:
+ self.sendSyncQuery()
+ return True
+
+ def correctSync( self ):
+ curTick = self.csnd.loopGetTick()
+ curTicksIn = curTick % Config.TICKS_PER_BEAT
+ ticksIn = self.heartbeatElapsedTicks()
+ err = curTicksIn - ticksIn
+ if err > Config.TICKS_PER_BEAT_DIV2:
+ err -= Config.TICKS_PER_BEAT
+ elif err < -Config.TICKS_PER_BEAT_DIV2:
+ err += Config.TICKS_PER_BEAT
+ correct = curTick - err
+ ticksPerLoop = Config.TICKS_PER_BEAT*self.beat
+ if correct > ticksPerLoop:
+ correct -= ticksPerLoop
+ elif correct < 0:
+ correct += ticksPerLoop
+ #print "correct:: %f ticks, %f ticks in, %f expected, %f err, correct %f" % (curTick, curTicksIn, ticksIn, err, correct)
+ if abs(err) > 0.25:
+ self.csnd.adjustTick(-err)
+
+
+if __name__ == "__main__":
+ MiniTamTam = miniTamTam()
+ #start the gtk event loop
+ gtk.main()
diff --git a/Mini/miniToolbars.py b/Mini/miniToolbars.py
new file mode 100644
index 0000000..867e00a
--- /dev/null
+++ b/Mini/miniToolbars.py
@@ -0,0 +1,384 @@
+import gtk
+import gobject
+import os, commands
+import common.Config as Config
+from common.Util.ThemeWidgets import *
+from common.Util import OS
+
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.toggletoolbutton import ToggleToolButton
+from sugar.graphics.palette import Palette
+from gettext import gettext as _
+
+class playToolbar(gtk.Toolbar):
+ def __init__(self,toolbox, miniTamTam):
+ gtk.Toolbar.__init__(self)
+
+ def _insertSeparator(x = 1):
+ for i in range(x):
+ self.separator = gtk.SeparatorToolItem()
+ self.separator.set_draw(True)
+ self.insert(self.separator,-1)
+ self.separator.show()
+
+ self.toolbox = toolbox
+ self.miniTamTam = miniTamTam
+
+ self.tooltips = gtk.Tooltips()
+
+ self.balanceSliderImgLeft = gtk.Image()
+ self.balanceSliderImgRight = gtk.Image()
+ self.balanceSliderImgLeft.set_from_file(Config.IMAGE_ROOT + 'dru2.png')
+ self.balanceSliderImgRight.set_from_file(Config.IMAGE_ROOT + 'instr2.png')
+ self.balanceSliderImgLeftTool = gtk.ToolItem()
+ self.balanceSliderImgLeftTool.add(self.balanceSliderImgLeft)
+ self.balanceSliderImgRightTool = gtk.ToolItem()
+ self.balanceSliderImgRightTool.add(self.balanceSliderImgRight)
+ self.balanceSliderAdj = gtk.Adjustment(value=50, lower=0, upper=100, step_incr=1, page_incr=0, page_size=0)
+ self.balanceSliderAdj.connect("value_changed" , self.miniTamTam.handleBalanceSlider)
+ self.balanceSlider = gtk.HScale(adjustment = self.balanceSliderAdj)
+ self.balanceSlider.set_size_request(250,15)
+ self.balanceSlider.set_inverted(False)
+ self.balanceSlider.set_draw_value(False)
+ self.balanceSliderTool = gtk.ToolItem()
+ self.balanceSliderTool.add(self.balanceSlider)
+ self.insert(self.balanceSliderImgLeftTool, -1)
+ self.insert(self.balanceSliderTool, -1)
+ self.insert(self.balanceSliderImgRightTool, -1)
+ self.balanceSliderImgLeft.show()
+ self.balanceSliderImgLeftTool.show()
+ self.balanceSliderImgRight.show()
+ self.balanceSliderImgRightTool.show()
+ self.balanceSlider.show()
+ self.balanceSliderTool.show()
+ self.balanceSliderTool.set_tooltip(self.tooltips, _('Balance'))
+
+ _insertSeparator(1)
+
+ self.reverbSliderImgRight = gtk.Image()
+ self.reverbSliderImgRight.set_from_file(Config.IMAGE_ROOT + 'reverb0.png')
+ self.reverbSliderImgRightTool = gtk.ToolItem()
+ self.reverbSliderImgRightTool.add(self.reverbSliderImgRight)
+
+ self.reverbSliderAdj = gtk.Adjustment(value=0.1, lower=0, upper=1, step_incr=0.1, page_incr=0, page_size=0)
+ self.reverbSliderAdj.connect("value_changed" , self.miniTamTam.handleReverbSlider)
+ self.reverbSlider = gtk.HScale(adjustment = self.reverbSliderAdj)
+ self.reverbSlider.set_size_request(250,15)
+ self.reverbSlider.set_inverted(False)
+ self.reverbSlider.set_draw_value(False)
+ self.reverbSliderTool = gtk.ToolItem()
+ self.reverbSliderTool.add(self.reverbSlider)
+ self.insert(self.reverbSliderTool, -1)
+ self.insert(self.reverbSliderImgRightTool, -1)
+ self.reverbSliderImgRight.show()
+ self.reverbSliderImgRightTool.show()
+ self.reverbSlider.show()
+ self.reverbSliderTool.show()
+ self.reverbSliderTool.set_tooltip(self.tooltips, _('Reverb'))
+
+
+class recordToolbar(gtk.Toolbar):
+ def __init__(self,toolbox, miniTamTam):
+ gtk.Toolbar.__init__(self)
+
+ def _insertSeparator(x = 1):
+ for i in range(x):
+ self.separator = gtk.SeparatorToolItem()
+ self.separator.set_draw(True)
+ self.insert(self.separator,-1)
+ self.separator.show()
+
+ self.toolbox = toolbox
+ self.miniTamTam = miniTamTam
+
+ self.micRec1Button = ToolButton('rec1')
+ self.micRec1Button.connect('clicked',self.miniTamTam.micRec,'mic1')
+ self.insert(self.micRec1Button, -1)
+ self.micRec1Button.show()
+ self.micRec1Button.set_tooltip(_('Record microphone into slot 1'))
+
+ self.micRec2Button = ToolButton('rec2')
+ self.micRec2Button.connect('clicked',self.miniTamTam.micRec,'mic2')
+ self.insert(self.micRec2Button, -1)
+ self.micRec2Button.show()
+ self.micRec2Button.set_tooltip(_('Record microphone into slot 2'))
+
+ self.micRec3Button = ToolButton('rec3')
+ self.micRec3Button.connect('clicked',self.miniTamTam.micRec,'mic3')
+ self.insert(self.micRec3Button, -1)
+ self.micRec3Button.show()
+ self.micRec3Button.set_tooltip(_('Record microphone into slot 3'))
+
+ self.micRec4Button = ToolButton('rec4')
+ self.micRec4Button.connect('clicked',self.miniTamTam.micRec,'mic4')
+ self.insert(self.micRec4Button, -1)
+ self.micRec4Button.show()
+ self.micRec4Button.set_tooltip(('Record microphone into slot 4'))
+
+ _insertSeparator()
+
+ self.keyboardRecButton = ToggleToolButton('keyrec')
+ self.keyboardRecButton.connect('clicked', self.miniTamTam.sequencer.handleRecordButton )
+ self.insert(self.keyboardRecButton, -1)
+ self.keyboardRecButton.show()
+ self.keyboardRecButton.set_tooltip(_('Click to record a loop'))
+
+ self.keyboardRecOverButton = ToggleToolButton('overrec')
+ self.keyboardRecOverButton.connect('clicked', self.miniTamTam.sequencer.handleOverButton )
+ self.insert(self.keyboardRecOverButton, -1)
+ self.keyboardRecOverButton.show()
+ self.keyboardRecOverButton.set_tooltip(_('Click to add a loop'))
+ #self.keyboardRecOverButton.set_sensitive(False)
+
+ self.keyboardRecMinusButton = ToolButton('minusrec')
+ self.keyboardRecMinusButton.connect('clicked', self.miniTamTam.sequencer.clearSequencer )
+ self.insert(self.keyboardRecMinusButton, -1)
+ self.keyboardRecMinusButton.show()
+ self.keyboardRecMinusButton.set_tooltip(_('Click to clear all loops'))
+
+ _insertSeparator()
+
+ self._loopSettingsPalette = LoopSettingsPalette(_('Add new Sound'), self.miniTamTam)
+ self.loopSetButton = ToggleToolButton('loop')
+ self.loopSetButton.set_palette(self._loopSettingsPalette)
+ self.insert(self.loopSetButton, -1)
+ self.loopSetButton.show()
+
+class LoopSettingsPalette( Palette ):
+ def __init__( self, label, mini ):
+ Palette.__init__( self, label )
+ self.connect('popup', self.handlePopup)
+ self.connect('popdown', self.handlePopdown)
+
+ self.mini = mini
+
+ self.tooltips = gtk.Tooltips()
+ self.loopedSound = False
+ self.soundLength = 1.00
+ self.start = 0
+ self.end = 1.00
+ self.dur = 0.01
+ self.volume = 1
+ self.register = 0
+ self.ok = True
+
+ self.mainBox = gtk.VBox()
+
+ self.controlsBox = gtk.HBox()
+
+ self.GUI = {}
+
+ self.soundBox = gtk.HBox()
+ self.soundLabel = gtk.Label(_('Sound: '))
+ self.soundMenuBox = BigComboBox()
+ self.sounds = os.listdir(Config.DATA_DIR)
+ for sound in self.sounds:
+ self.soundMenuBox.append_item(self.sounds.index(sound), sound)
+ self.soundMenuBox.connect('changed', self.handleSound)
+ self.soundBox.pack_start(self.soundLabel, False, False, padding=10)
+ self.soundBox.pack_start(self.soundMenuBox, False, False, padding=10)
+
+ self.mainBox.pack_start(self.soundBox, False, False, 10)
+
+ nameBox = gtk.VBox()
+ self.nameEntry = gtk.Entry()
+ entrycolor = gtk.gdk.Color()
+ self.nameEntry.modify_text(gtk.STATE_NORMAL, entrycolor)
+ self.nameEntry.set_text("name_of_the_sound")
+ nameBox.pack_start(self.nameEntry)
+ self.mainBox.pack_start(nameBox, False, False, 10)
+
+ registerBox = gtk.HBox()
+ self.registerBoxLabel = gtk.Label(_('Register: '))
+ self.registerMenuBox = BigComboBox()
+ self.registers = ['LOW', 'MID', 'HIGH', 'PUNCH']
+ for reg in self.registers:
+ self.registerMenuBox.append_item(self.registers.index(reg), reg)
+ self.registerMenuBox.connect('changed', self.handleRegister)
+ registerBox.pack_start(self.registerBoxLabel, False, False, padding=10)
+ registerBox.pack_end(self.registerMenuBox, False, False, padding=10)
+ self.mainBox.pack_start(registerBox, False, False, 10)
+
+ loopedBox = gtk.HBox()
+ loopedLabel = gtk.Label("Looped sound: ")
+ loopedToggle = ImageToggleButton(Config.IMAGE_ROOT+"checkOff.svg",Config.IMAGE_ROOT+"checkOn.svg")
+ loopedToggle.connect('button-press-event', self.handleLooped )
+ loopedBox.pack_start(loopedLabel, False, False, padding=10)
+ loopedBox.pack_end(loopedToggle, False, False, padding=10)
+ self.mainBox.pack_start(loopedBox, False, False, 10)
+
+ startBox = gtk.VBox()
+ self.startAdjust = gtk.Adjustment( 0.01, 0, 1., .001, .001, 0)
+ self.GUI['startSlider'] = gtk.VScale( adjustment = self.startAdjust )
+ self.startAdjust.connect("value-changed", self.handleStart)
+ self.GUI['startSlider'].set_inverted(True)
+ self.GUI['startSlider'].set_size_request(50, 200)
+ self.GUI['startSlider'].set_digits(3)
+ self.handleStart( self.startAdjust )
+ startBox.pack_start(self.GUI['startSlider'], True, True, 5)
+ self.controlsBox.pack_start(startBox)
+
+ endBox = gtk.VBox()
+ self.endAdjust = gtk.Adjustment( 0.9, 0, 1, .001, .001, 0)
+ self.GUI['endSlider'] = gtk.VScale( adjustment = self.endAdjust )
+ self.endAdjust.connect("value-changed", self.handleEnd)
+ self.GUI['endSlider'].set_inverted(True)
+ self.GUI['endSlider'].set_size_request(50, 200)
+ self.GUI['endSlider'].set_digits(3)
+ self.handleEnd( self.endAdjust )
+ endBox.pack_start(self.GUI['endSlider'], True, True, 5)
+ self.controlsBox.pack_start(endBox)
+
+ durBox = gtk.VBox()
+ self.durAdjust = gtk.Adjustment( 0.01, 0, 0.2, .001, .001, 0)
+ self.GUI['durSlider'] = gtk.VScale( adjustment = self.durAdjust )
+ self.durAdjust.connect("value-changed", self.handleDur)
+ self.GUI['durSlider'].set_inverted(True)
+ self.GUI['durSlider'].set_size_request(50, 200)
+ self.GUI['durSlider'].set_digits(3)
+ self.handleDur( self.durAdjust )
+ durBox.pack_start(self.GUI['durSlider'], True, True, 5)
+ self.controlsBox.pack_start(durBox)
+
+ volBox = gtk.VBox()
+ self.volAdjust = gtk.Adjustment( 1, 0, 2, .01, .01, 0)
+ self.GUI['volSlider'] = gtk.VScale( adjustment = self.volAdjust )
+ self.volAdjust.connect("value-changed", self.handleVol)
+ self.GUI['volSlider'].set_inverted(True)
+ self.GUI['volSlider'].set_size_request(50, 200)
+ self.GUI['volSlider'].set_digits(3)
+ self.handleVol( self.volAdjust )
+ volBox.pack_start(self.GUI['volSlider'], True, True, 5)
+ self.controlsBox.pack_start(volBox)
+
+ self.mainBox.pack_start(self.controlsBox, False, False, 10)
+
+ previewBox = gtk.VBox()
+ self.playStopButton = ImageToggleButton(Config.IMAGE_ROOT + 'miniplay.png', Config.IMAGE_ROOT + 'stop.png')
+ self.playStopButton.connect('button-press-event' , self.handlePlayButton)
+ previewBox.pack_start(self.playStopButton)
+ self.mainBox.pack_start(previewBox, False, False, 10)
+
+ checkBox = gtk.VBox()
+ checkButton = ImageButton(Config.TAM_TAM_ROOT + '/icons/accept.svg')
+ checkButton.connect('clicked' , self.handleCheck)
+ checkBox.pack_start(checkButton)
+ self.mainBox.pack_start(checkBox, False, False, 10)
+
+ self.mainBox.show_all()
+ self.set_content(self.mainBox)
+
+ def handlePopup(self, widget, data=None):
+ self.setButtonState()
+ self.soundMenuBox.remove_all()
+ self.sounds = os.listdir(Config.DATA_DIR)
+ for sound in self.sounds:
+ self.soundMenuBox.append_item(self.sounds.index(sound), sound)
+ self.nameEntry.set_text("name_of_the_sound")
+
+ def handlePopdown(self, widget, data=None):
+ if self.playStopButton.get_active() == True:
+ self.mini.loopSettingsPlayStop(True, self.loopedSound)
+
+ def handleSound(self, widget, data=None):
+ self.sndname = self.sounds[widget.props.value]
+ fullname = Config.DATA_DIR + '/' + self.sndname
+ results = OS.system("du -b %s" % fullname)
+ if results[0] == 0:
+ list = results[1].split()
+ soundLength = float(list[0]) / 2 / 16000.
+ self.nameEntry.set_text(self.sndname)
+ self.set_values(soundLength)
+ self.startAdjust.set_all( 0.01, 0, soundLength, .001, .001, 0)
+ self.endAdjust.set_all( soundLength-0.01, 0, soundLength, .001, .001, 0)
+ self.timeoutLoad = gobject.timeout_add(2000, self.loopSettingsDelay)
+
+ def loopSettingsDelay(self):
+ self.mini.load_ls_instrument(self.sndname)
+ gobject.source_remove( self.timeoutLoad )
+
+ def handleCheck(self, widget):
+ if self.nameEntry.get_text() != self.sndname:
+ oldName = self.sndname
+ self.sndname = self.nameEntry.get_text()
+ copy = True
+ else:
+ copy = False
+
+ ofile = open(Config.SNDS_INFO_DIR + '/' + self.sndname, 'w')
+ if self.loopedSound:
+ tied = str(Config.INST_TIED)
+ else:
+ tied = str(Config.INST_SIMP)
+ register = str(self.register)
+ category = 'mysounds'
+ start = str(self.start)
+ end = str(self.end)
+ dur = str(self.dur)
+ vol = str(self.volume)
+
+ ofile.write('TamTam idf v1\n')
+ ofile.write(self.sndname + '\n')
+ ofile.write(tied + '\n')
+ ofile.write(register + '\n')
+ ofile.write(start + '\n')
+ ofile.write(end + '\n')
+ ofile.write(dur + '\n')
+ ofile.write(vol + '\n')
+ ofile.write(self.sndname + '\n')
+ ofile.write(Config.IMAGE_ROOT+"/"+self.sndname+".png\n")
+ ofile.write(category)
+ ofile.close()
+ if copy:
+ OS.system('cp ' + Config.DATA_DIR + '/' + oldName + ' ' + Config.DATA_DIR + '/' + self.sndname)
+
+ def set_values(self, soundLength):
+ self.soundLength = soundLength
+ self.handleStart(self.GUI['startSlider'])
+ self.handleEnd(self.GUI['endSlider'])
+
+ def handleLooped(self, widget, data=None):
+ if widget.get_active() == True:
+ self.loopedSound = False
+ else:
+ self.loopedSound = True
+
+ def handleRegister(self, widget, data=None):
+ self.register = self.registers[widget.props.value]
+
+ def handleStart(self, widget, data=None):
+ self.start = self.startAdjust.value
+ if self.start > self.end:
+ self.start = self.end
+ self.mini.loopSettingsChannel('lstart', self.start)
+
+ def handleEnd(self, widget, data=None):
+ self.end = self.endAdjust.value
+ if self.end < self.start:
+ self.end = self.start
+ self.mini.loopSettingsChannel('lend', self.end)
+
+ def handleDur(self, widget, data=None):
+ self.dur = self.durAdjust.value
+ self.mini.loopSettingsChannel('ldur', self.dur)
+
+ def handleVol(self, widget, data=None):
+ self.volume = self.volAdjust.value
+ self.mini.loopSettingsChannel('lvol', self.volume)
+
+ def handlePlayButton(self, widget, data=None):
+ if self.ok:
+ self.mini.loopSettingsPlayStop(widget.get_active(), self.loopedSound)
+ if self.loopedSound == False and widget.get_active() == False:
+ self.timeoutStop = gobject.timeout_add(int(self.soundLength * 1000)+500, self.playButtonState)
+
+ def setButtonState(self):
+ self.ok = False
+ self.playStopButton.set_active(False)
+ self.ok = True
+
+ def playButtonState(self):
+ self.ok = False
+ self.playStopButton.set_active(False)
+ gobject.source_remove(self.timeoutStop)
+ self.ok = True