diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.py b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.py
new file mode 100644
index 0000000..efeed79
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.py
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.pyc b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.pyc
new file mode 100644
index 0000000..deadd32
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/__init__.pyc
Binary files differ
diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.py b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.py
new file mode 100644
index 0000000..72a8706
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.py
@@ -0,0 +1,260 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+'''
+
+This is an extra tool, not bundled with the default waf binary.
+To add the boost tool to the waf file:
+$ ./waf-light --tools=compat15,boost
+	or, if you have waf >= 1.6.2
+$ ./waf update --files=boost
+
+When using this tool, the wscript will look like:
+
+	def options(opt):
+		opt.load('compiler_cxx boost')
+
+	def configure(conf):
+		conf.load('compiler_cxx boost')
+		conf.check_boost(lib='system filesystem')
+
+	def build(bld):
+		bld(source='main.cpp', target='app', use='BOOST')
+
+Options are generated, in order to specify the location of boost includes/libraries.
+The `check_boost` configuration function allows to specify the used boost libraries.
+It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
+Everything will be packaged together in a BOOST component that you can use.
+
+When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
+ - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
+   Errors: C4530
+ - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
+   So before calling `conf.check_boost` you might want to disabling by adding:
+   	conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
+   Errors: 
+ - boost might also be compiled with /MT, which links the runtime statically.
+   If you have problems with redefined symbols, 
+		self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+		self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
+Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
+
+'''
+import sys
+import re
+from waflib import Utils,Logs,Errors
+from waflib.Configure import conf
+BOOST_LIBS=['/usr/lib','/usr/local/lib','/opt/local/lib','/sw/lib','/lib']
+BOOST_INCLUDES=['/usr/include','/usr/local/include','/opt/local/include','/sw/include']
+BOOST_VERSION_FILE='boost/version.hpp'
+BOOST_VERSION_CODE='''
+#include <iostream>
+#include <boost/version.hpp>
+int main() { std::cout << BOOST_LIB_VERSION << std::endl; }
+'''
+PLATFORM=Utils.unversioned_sys_platform()
+detect_intel=lambda env:(PLATFORM=='win32')and'iw'or'il'
+detect_clang=lambda env:(PLATFORM=='darwin')and'clang-darwin'or'clang'
+detect_mingw=lambda env:(re.search('MinGW',env.CXX[0]))and'mgw'or'gcc'
+BOOST_TOOLSETS={'borland':'bcb','clang':detect_clang,'como':'como','cw':'cw','darwin':'xgcc','edg':'edg','g++':detect_mingw,'gcc':detect_mingw,'icpc':detect_intel,'intel':detect_intel,'kcc':'kcc','kylix':'bck','mipspro':'mp','mingw':'mgw','msvc':'vc','qcc':'qcc','sun':'sw','sunc++':'sw','tru64cxx':'tru','vacpp':'xlc'}
+def options(opt):
+	opt.add_option('--boost-includes',type='string',default='',dest='boost_includes',help='''path to the boost includes root (~boost root)
+				   e.g. /path/to/boost_1_47_0''')
+	opt.add_option('--boost-libs',type='string',default='',dest='boost_libs',help='''path to the directory where the boost libs are
+				   e.g. /path/to/boost_1_47_0/stage/lib''')
+	opt.add_option('--boost-static',action='store_true',default=False,dest='boost_static',help='link with static boost libraries (.lib/.a)')
+	opt.add_option('--boost-mt',action='store_true',default=False,dest='boost_mt',help='select multi-threaded libraries')
+	opt.add_option('--boost-abi',type='string',default='',dest='boost_abi',help='''select libraries with tags (dgsyp, d for debug),
+				   see doc Boost, Getting Started, chapter 6.1''')
+	opt.add_option('--boost-linkage_autodetect',action="store_true",dest='boost_linkage_autodetect',help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
+	opt.add_option('--boost-toolset',type='string',default='',dest='boost_toolset',help='force a toolset e.g. msvc, vc90, \
+						gcc, mingw, mgw45 (default: auto)')
+	py_version='%d%d'%(sys.version_info[0],sys.version_info[1])
+	opt.add_option('--boost-python',type='string',default=py_version,dest='boost_python',help='select the lib python with this version \
+						(default: %s)'%py_version)
+@conf
+def __boost_get_version_file(self,dir):
+	try:
+		return self.root.find_dir(dir).find_node(BOOST_VERSION_FILE)
+	except:
+		return None
+@conf
+def boost_get_version(self,dir):
+	re_but=re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"$',re.M)
+	try:
+		val=re_but.search(self.__boost_get_version_file(dir).read()).group(1)
+	except:
+		val=self.check_cxx(fragment=BOOST_VERSION_CODE,includes=[dir],execute=False,define_ret=True)
+	return val
+@conf
+def boost_get_includes(self,*k,**kw):
+	includes=k and k[0]or kw.get('includes',None)
+	if includes and self.__boost_get_version_file(includes):
+		return includes
+	for d in Utils.to_list(self.environ.get('INCLUDE',''))+BOOST_INCLUDES:
+		if self.__boost_get_version_file(d):
+			return d
+	if includes:
+		self.end_msg('headers not found in %s'%includes)
+		self.fatal('The configuration failed')
+	else:
+		self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
+		self.fatal('The configuration failed')
+@conf
+def boost_get_toolset(self,cc):
+	toolset=cc
+	if not cc:
+		build_platform=Utils.unversioned_sys_platform()
+		if build_platform in BOOST_TOOLSETS:
+			cc=build_platform
+		else:
+			cc=self.env.CXX_NAME
+	if cc in BOOST_TOOLSETS:
+		toolset=BOOST_TOOLSETS[cc]
+	return isinstance(toolset,str)and toolset or toolset(self.env)
+@conf
+def __boost_get_libs_path(self,*k,**kw):
+	''' return the lib path and all the files in it '''
+	if'files'in kw:
+		return self.root.find_dir('.'),Utils.to_list(kw['files'])
+	libs=k and k[0]or kw.get('libs',None)
+	if libs:
+		path=self.root.find_dir(libs)
+		files=path.ant_glob('*boost_*')
+	if not libs or not files:
+		for d in Utils.to_list(self.environ.get('LIB',[]))+BOOST_LIBS:
+			try:
+				path=self.root.find_dir(d)
+				files=path.ant_glob('*boost_*')
+				if files:
+					break
+				path=self.root.find_dir(d+'64')
+				files=path.ant_glob('*boost_*')
+				if files:
+					break
+			except:
+				path=None
+	if not path:
+		if libs:
+			self.end_msg('libs not found in %s'%libs)
+			self.fatal('The configuration failed')
+		else:
+			self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
+			self.fatal('The configuration failed')
+	self.to_log('Found the boost path in %r with the libraries:'%path)
+	for x in files:
+		self.to_log('    %r'%x)
+	return path,files
+@conf
+def boost_get_libs(self,*k,**kw):
+	'''
+	return the lib path and the required libs
+	according to the parameters
+	'''
+	path,files=self.__boost_get_libs_path(**kw)
+	t=[]
+	if kw.get('mt',False):
+		t.append('mt')
+	if kw.get('abi',None):
+		t.append(kw['abi'])
+	tags=t and'(-%s)+'%'-'.join(t)or''
+	toolset=self.boost_get_toolset(kw.get('toolset',''))
+	toolset_pat='(-%s[0-9]{0,3})+'%toolset
+	version='(-%s)+'%self.env.BOOST_VERSION
+	def find_lib(re_lib,files):
+		for file in files:
+			if re_lib.search(file.name):
+				self.to_log('Found boost lib %s'%file)
+				return file
+		return None
+	def format_lib_name(name):
+		if name.startswith('lib')and self.env.CC_NAME!='msvc':
+			name=name[3:]
+		return name[:name.rfind('.')]
+	libs=[]
+	for lib in Utils.to_list(k and k[0]or kw.get('lib',None)):
+		py=(lib=='python')and'(-py%s)+'%kw['python']or''
+		for pattern in['boost_%s%s%s%s%s'%(lib,toolset_pat,tags,py,version),'boost_%s%s%s%s'%(lib,tags,py,version),'boost_%s%s%s'%(lib,tags,version),'boost_%s%s%s%s'%(lib,toolset_pat,tags,py),'boost_%s%s%s'%(lib,tags,py),'boost_%s%s'%(lib,tags)]:
+			self.to_log('Trying pattern %s'%pattern)
+			file=find_lib(re.compile(pattern),files)
+			if file:
+				libs.append(format_lib_name(file.name))
+				break
+		else:
+			self.end_msg('lib %s not found in %s'%(lib,path.abspath()))
+			self.fatal('The configuration failed')
+	return path.abspath(),libs
+@conf
+def check_boost(self,*k,**kw):
+	if not self.env['CXX']:
+		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
+	params={'lib':k and k[0]or kw.get('lib',None)}
+	for key,value in self.options.__dict__.items():
+		if not key.startswith('boost_'):
+			continue
+		key=key[len('boost_'):]
+		params[key]=value and value or kw.get(key,'')
+	var=kw.get('uselib_store','BOOST')
+	self.start_msg('Checking boost includes')
+	self.env['INCLUDES_%s'%var]=inc=self.boost_get_includes(**params)
+	self.env.BOOST_VERSION=self.boost_get_version(inc)
+	self.end_msg(self.env.BOOST_VERSION)
+	if Logs.verbose:
+		Logs.pprint('CYAN','	path : %s'%self.env['INCLUDES_%s'%var])
+	if not params['lib']:
+		return
+	self.start_msg('Checking boost libs')
+	suffix=params.get('static',None)and'ST'or''
+	path,libs=self.boost_get_libs(**params)
+	self.env['%sLIBPATH_%s'%(suffix,var)]=[path]
+	self.env['%sLIB_%s'%(suffix,var)]=libs
+	self.end_msg('ok')
+	if Logs.verbose:
+		Logs.pprint('CYAN','	path : %s'%path)
+		Logs.pprint('CYAN','	libs : %s'%libs)
+	def try_link():
+		if'system'in params['lib']:
+			self.check_cxx(fragment="\n".join(['#include <boost/system/error_code.hpp>','int main() { boost::system::error_code c; }',]),use=var,execute=False,)
+		if'thread'in params['lib']:
+			self.check_cxx(fragment="\n".join(['#include <boost/thread.hpp>','int main() { boost::thread t; }',]),use=var,execute=False,)
+	if params.get('linkage_autodetect',False):
+		self.start_msg("Attempting to detect boost linkage flags")
+		toolset=self.boost_get_toolset(kw.get('toolset',''))
+		if toolset in['vc']:
+			self.env['DEFINES_%s'%var]+=['BOOST_ALL_NO_LIB']
+			has_dlls=False
+			for x in Utils.listdir(path):
+				if x.endswith(self.env.cxxshlib_PATTERN%''):
+					has_dlls=True
+					break
+			if not has_dlls:
+				self.env['STLIBPATH_%s'%var]=[path]
+				self.env['STLIB_%s'%var]=libs
+				del self.env['LIB_%s'%var]
+				del self.env['LIBPATH_%s'%var]
+			for cxxflags in(['/MD','/EHsc'],[]):
+				self.env.stash()
+				self.env["CXXFLAGS_%s"%var]+=cxxflags
+				try:
+					try_link()
+					self.end_msg("ok: winning cxxflags combination: %s"%(self.env["CXXFLAGS_%s"%var]))
+					e=None
+					break
+				except Errors.ConfigurationError as exc:
+					self.env.revert()
+					e=exc
+			if e is not None:
+				self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author",ex=e)
+				self.fatal('The configuration failed')
+		else:
+			self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
+			self.fatal('The configuration failed')
+	else:
+		self.start_msg('Checking for boost linkage')
+		try:
+			try_link()
+		except Errors.ConfigurationError ,e:
+			self.end_msg("Could not link against boost libraries using supplied options")
+			self.fatal('The configuration failed')
+		self.end_msg('ok')
diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.pyc b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.pyc
new file mode 100644
index 0000000..3ab3bca
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/boost.pyc
Binary files differ
diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/doxygen.py b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/doxygen.py
new file mode 100644
index 0000000..10c425c
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/doxygen.py
@@ -0,0 +1,145 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from fnmatch import fnmatchcase
+import os,os.path,re,stat
+from waflib import Task,Utils,Node,Logs
+from waflib.TaskGen import feature
+DOXY_STR='${DOXYGEN} - '
+DOXY_FMTS='html latex man rft xml'.split()
+DOXY_FILE_PATTERNS='*.'+' *.'.join('''
+c cc cxx cpp c++ java ii ixx ipp i++ inl h hh hxx hpp h++ idl odl cs php php3
+inc m mm py f90c cc cxx cpp c++ java ii ixx ipp i++ inl h hh hxx
+'''.split())
+re_rl=re.compile('\\\\\r*\n',re.MULTILINE)
+re_nl=re.compile('\r*\n',re.M)
+def parse_doxy(txt):
+	tbl={}
+	txt=re_rl.sub('',txt)
+	lines=re_nl.split(txt)
+	for x in lines:
+		x=x.strip()
+		if not x or x.startswith('#')or x.find('=')<0:
+			continue
+		if x.find('+=')>=0:
+			tmp=x.split('+=')
+			key=tmp[0].strip()
+			if key in tbl:
+				tbl[key]+=' '+'+='.join(tmp[1:]).strip()
+			else:
+				tbl[key]='+='.join(tmp[1:]).strip()
+		else:
+			tmp=x.split('=')
+			tbl[tmp[0].strip()]='='.join(tmp[1:]).strip()
+	return tbl
+class doxygen(Task.Task):
+	vars=['DOXYGEN','DOXYFLAGS']
+	color='BLUE'
+	def runnable_status(self):
+		'''
+		self.pars are populated in runnable_status - because this function is being
+		run *before* both self.pars "consumers" - scan() and run()
+
+		set output_dir (node) for the output
+		'''
+		for x in self.run_after:
+			if not x.hasrun:
+				return Task.ASK_LATER
+		if not getattr(self,'pars',None):
+			txt=self.inputs[0].read()
+			self.pars=parse_doxy(txt)
+			if not self.pars.get('OUTPUT_DIRECTORY'):
+				self.pars['OUTPUT_DIRECTORY']=self.inputs[0].parent.get_bld().abspath()
+			self.doxy_inputs=getattr(self,'doxy_inputs',[])
+			if not self.pars.get('INPUT'):
+				self.doxy_inputs.append(self.inputs[0].parent)
+			else:
+				for i in self.pars.get('INPUT').split():
+					if os.path.isabs(i):
+						node=self.generator.bld.root.find_node(i)
+					else:
+						node=self.generator.path.find_node(i)
+					if not node:
+						self.generator.bld.fatal('Could not find the doxygen input %r'%i)
+					self.doxy_inputs.append(node)
+		if not getattr(self,'output_dir',None):
+			bld=self.generator.bld
+			self.output_dir=bld.root.find_dir(self.pars['OUTPUT_DIRECTORY'])
+			if not self.output_dir:
+				self.output_dir=bld.path.find_or_declare(self.pars['OUTPUT_DIRECTORY'])
+		self.signature()
+		return Task.Task.runnable_status(self)
+	def scan(self):
+		if self.pars.get('RECURSIVE')=='YES':
+			Logs.warn("Doxygen RECURSIVE dependencies are not supported")
+		exclude_patterns=self.pars.get('EXCLUDE_PATTERNS','').split()
+		file_patterns=self.pars.get('FILE_PATTERNS','').split()
+		if not file_patterns:
+			file_patterns=DOXY_FILE_PATTERNS
+		nodes=[]
+		names=[]
+		for node in self.doxy_inputs:
+			if os.path.isdir(node.abspath()):
+				for m in node.ant_glob(file_patterns):
+					nodes.append(m)
+			else:
+				nodes.append(node)
+		return(nodes,names)
+	def run(self):
+		dct=self.pars.copy()
+		dct['INPUT']=' '.join([x.abspath()for x in self.doxy_inputs])
+		code='\n'.join(['%s = %s'%(x,dct[x])for x in self.pars])
+		code=code
+		cmd=Utils.subst_vars(DOXY_STR,self.env)
+		env=self.env.env or None
+		proc=Utils.subprocess.Popen(cmd,shell=True,stdin=Utils.subprocess.PIPE,env=env,cwd=self.generator.bld.path.get_bld().abspath())
+		proc.communicate(code)
+		return proc.returncode
+	def post_run(self):
+		nodes=self.output_dir.ant_glob('**/*',quiet=True)
+		for x in nodes:
+			x.sig=Utils.h_file(x.abspath())
+		self.outputs+=nodes
+		return Task.Task.post_run(self)
+class tar(Task.Task):
+	run_str='${TAR} ${TAROPTS} ${TGT} ${SRC}'
+	color='RED'
+	after=['doxygen']
+	def runnable_status(self):
+		for x in getattr(self,'input_tasks',[]):
+			if not x.hasrun:
+				return Task.ASK_LATER
+		if not getattr(self,'tar_done_adding',None):
+			self.tar_done_adding=True
+			for x in getattr(self,'input_tasks',[]):
+				self.set_inputs(x.outputs)
+			if not self.inputs:
+				return Task.SKIP_ME
+		return Task.Task.runnable_status(self)
+	def __str__(self):
+		tgt_str=' '.join([a.nice_path(self.env)for a in self.outputs])
+		return'%s: %s\n'%(self.__class__.__name__,tgt_str)
+@feature('doxygen')
+def process_doxy(self):
+	if not getattr(self,'doxyfile',None):
+		self.generator.bld.fatal('no doxyfile??')
+	node=self.doxyfile
+	if not isinstance(node,Node.Node):
+		node=self.path.find_resource(node)
+	if not node:
+		raise ValueError('doxygen file not found')
+	dsk=self.create_task('doxygen',node)
+	if getattr(self,'doxy_tar',None):
+		tsk=self.create_task('tar')
+		tsk.input_tasks=[dsk]
+		tsk.set_outputs(self.path.find_or_declare(self.doxy_tar))
+		if self.doxy_tar.endswith('bz2'):
+			tsk.env['TAROPTS']=['cjf']
+		elif self.doxy_tar.endswith('gz'):
+			tsk.env['TAROPTS']=['czf']
+		else:
+			tsk.env['TAROPTS']=['cf']
+def configure(conf):
+	conf.find_program('doxygen',var='DOXYGEN')
+	conf.find_program('tar',var='TAR')
diff --git a/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/protoc.py b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/protoc.py
new file mode 100644
index 0000000..d5feb5a
--- /dev/null
+++ b/src/.waf-1.7.11-bbc5cd6dca9f655c3704b49a62d00211/waflib/extras/protoc.py
@@ -0,0 +1,25 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib.Task import Task
+from waflib.TaskGen import extension
+class protoc(Task):
+	run_str='${PROTOC} ${PROTOC_FLAGS} ${PROTOC_ST:INCPATHS} ${SRC[0].abspath()}'
+	color='BLUE'
+	ext_out=['.h','pb.cc']
+@extension('.proto')
+def process_protoc(self,node):
+	cpp_node=node.change_ext('.pb.cc')
+	hpp_node=node.change_ext('.pb.h')
+	self.create_task('protoc',node,[cpp_node,hpp_node])
+	self.source.append(cpp_node)
+	if'cxx'in self.features and not self.env.PROTOC_FLAGS:
+		self.env.PROTOC_FLAGS='--cpp_out=%s'%node.parent.get_bld().abspath()
+	use=getattr(self,'use','')
+	if not'PROTOBUF'in use:
+		self.use=self.to_list(use)+['PROTOBUF']
+def configure(conf):
+	conf.check_cfg(package="protobuf",uselib_store="PROTOBUF",args=['--cflags','--libs'])
+	conf.find_program('protoc',var='PROTOC')
+	conf.env.PROTOC_ST='-I%s'
