[pypy-commit] extradoc extradoc: merge heads

lac noreply at buildbot.pypy.org
Mon Jun 27 13:27:25 CEST 2011


Author: Laura Creighton <lac at openend.se>
Branch: extradoc
Changeset: r3790:91464a501e73
Date: 2011-06-27 13:27 +0200
http://bitbucket.org/pypy/extradoc/changeset/91464a501e73/

Log:	merge heads

diff --git a/.hgignore b/.hgignore
new file mode 100644
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1,2 @@
+syntax: glob
+*.py[co]
diff --git a/blog/draft/survey_results.rst b/blog/draft/survey_results.rst
new file mode 100644
--- /dev/null
+++ b/blog/draft/survey_results.rst
@@ -0,0 +1,32 @@
+Report back from our survey
+===========================
+
+Hi all,
+
+I'm here to report back the results of our survey. First, we're very pleased to
+report that a number of you guys are happilly running PyPy in production! Most
+(97%) of the respondants using PyPy are using it because it's faster, but a
+further 26% (respondants could choose multiple answers) are using it because of
+lower memory usage. Of users who aren't using PyPy, the most common reason was
+C extensions, followed by "Other".
+
+From reading the extra comments section there are a few things we've learned:
+
+a) Google docs needs a better UI for this stuff
+b) A huge number of people want NumPy and SciPy, it was easily the most
+   requested C extension (25% of respondants said somthing about NumPy). We've
+   already blogged on the topic of `our plans for NumPy`_.
+c) Having packages in the various OS's repositories would be a big help in
+   getting users up and running.
+
+A huge thanks to everyone who responded! Finally, if you're using PyPy in
+production we'd love to get a testimonial from you, if you're willing to spare
+a few minutes to give us a quote or two please get in contact with us via `our
+mailing list`_.
+
+Thanks,
+Alex
+
+
+.. _`our plans for NumPy`: http://morepypy.blogspot.com/2011/05/numpy-in-pypy-status-and-roadmap.html
+.. _`our mailing list`: http://mail.python.org/mailman/listinfo/pypy-dev
\ No newline at end of file
diff --git a/pytest_restdoc.py b/pytest_restdoc.py
new file mode 100644
--- /dev/null
+++ b/pytest_restdoc.py
@@ -0,0 +1,430 @@
+"""
+perform ReST syntax, local and remote reference tests on .rst/.txt files.
+"""
+import py
+import sys, os, re
+
+def pytest_addoption(parser):
+    group = parser.getgroup("ReST", "ReST documentation check options")
+    group.addoption('-R', '--urlcheck',
+           action="store_true", dest="urlcheck", default=False,
+           help="urlopen() remote links found in ReST text files.")
+    group.addoption('--urltimeout', action="store", metavar="secs",
+        type="int", dest="urlcheck_timeout", default=5,
+        help="timeout in seconds for remote urlchecks")
+    group.addoption('--forcegen',
+           action="store_true", dest="forcegen", default=False,
+           help="force generation of html files.")
+
+def pytest_collect_file(path, parent):
+    if path.ext in (".txt", ".rst"):
+        project = getproject(path)
+        if project is not None:
+            return ReSTFile(path, parent=parent, project=project)
+
+def getproject(path):
+    for parent in path.parts(reverse=True):
+        confrest = parent.join("confrest.py")
+        if confrest.check():
+            print (confrest)
+            Project = confrest.pyimport().Project
+            return Project(parent)
+
+class ReSTFile(py.test.collect.File):
+    def __init__(self, fspath, parent, project):
+        super(ReSTFile, self).__init__(fspath=fspath, parent=parent)
+        self.project = project
+
+    def collect(self):
+        return [
+            ReSTSyntaxTest("ReSTSyntax", parent=self, project=self.project),
+            LinkCheckerMaker("checklinks", parent=self),
+            DoctestText("doctest", parent=self),
+        ]
+
+def deindent(s, sep='\n'):
+    leastspaces = -1
+    lines = s.split(sep)
+    for line in lines:
+        if not line.strip():
+            continue
+        spaces = len(line) - len(line.lstrip())
+        if leastspaces == -1 or spaces < leastspaces:
+            leastspaces = spaces
+    if leastspaces == -1:
+        return s
+    for i, line in enumerate(lines):
+        if not line.strip():
+            lines[i] = ''
+        else:
+            lines[i] = line[leastspaces:]
+    return sep.join(lines)
+
+class ReSTSyntaxTest(py.test.collect.Item):
+    def __init__(self, name, parent, project):
+        super(ReSTSyntaxTest, self).__init__(name=name, parent=parent)
+        self.project = project
+
+    def reportinfo(self):
+        return self.fspath, None, "syntax check"
+
+    def runtest(self):
+        self.restcheck(py.path.svnwc(self.fspath))
+
+    def restcheck(self, path):
+        py.test.importorskip("docutils")
+        self.register_linkrole()
+        from docutils.utils import SystemMessage
+        try:
+            self._checkskip(path, self.project.get_htmloutputpath(path))
+            self.project.process(path)
+        except KeyboardInterrupt:
+            raise
+        except SystemMessage:
+            # we assume docutils printed info on stdout
+            py.test.fail("docutils processing failed, see captured stderr")
+
+    def register_linkrole(self):
+        #directive.register_linkrole('api', self.resolve_linkrole)
+        #directive.register_linkrole('source', self.resolve_linkrole)
+#
+#        # XXX fake sphinx' "toctree" and refs
+#        directive.register_linkrole('ref', self.resolve_linkrole)
+
+        from docutils.parsers.rst import directives
+        def toctree_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+            return []
+        toctree_directive.content = 1
+        toctree_directive.options = {'maxdepth': int, 'glob': directives.flag,
+                             'hidden': directives.flag}
+        directives.register_directive('toctree', toctree_directive)
+        self.register_pygments()
+
+    def register_pygments(self):
+        # taken from pygments-main/external/rst-directive.py
+        from docutils.parsers.rst import directives
+        try:
+            from pygments.formatters import HtmlFormatter
+        except ImportError:
+            def pygments_directive(name, arguments, options, content, lineno,
+                                   content_offset, block_text, state, state_machine):
+                return []
+            pygments_directive.options = {}
+        else:
+            # The default formatter
+            DEFAULT = HtmlFormatter(noclasses=True)
+            # Add name -> formatter pairs for every variant you want to use
+            VARIANTS = {
+                # 'linenos': HtmlFormatter(noclasses=INLINESTYLES, linenos=True),
+            }
+
+            from docutils import nodes
+
+            from pygments import highlight
+            from pygments.lexers import get_lexer_by_name, TextLexer
+
+            def pygments_directive(name, arguments, options, content, lineno,
+                                   content_offset, block_text, state, state_machine):
+                try:
+                    lexer = get_lexer_by_name(arguments[0])
+                except ValueError:
+                    # no lexer found - use the text one instead of an exception
+                    lexer = TextLexer()
+                # take an arbitrary option if more than one is given
+                formatter = options and VARIANTS[options.keys()[0]] or DEFAULT
+                parsed = highlight('\n'.join(content), lexer, formatter)
+                return [nodes.raw('', parsed, format='html')]
+
+            pygments_directive.options = dict([(key, directives.flag) for key in VARIANTS])
+
+        pygments_directive.arguments = (1, 0, 1)
+        pygments_directive.content = 1
+        directives.register_directive('sourcecode', pygments_directive)
+
+    def resolve_linkrole(self, name, text, check=True):
+        apigen_relpath = self.project.apigen_relpath
+
+        if name == 'api':
+            if text == 'py':
+                return ('py', apigen_relpath + 'api/index.html')
+            else:
+                assert text.startswith('py.'), (
+                    'api link "%s" does not point to the py package') % (text,)
+                dotted_name = text
+                if dotted_name.find('(') > -1:
+                    dotted_name = dotted_name[:text.find('(')]
+                # remove pkg root
+                path = dotted_name.split('.')[1:]
+                dotted_name = '.'.join(path)
+                obj = py
+                if check:
+                    for chunk in path:
+                        try:
+                            obj = getattr(obj, chunk)
+                        except AttributeError:
+                            raise AssertionError(
+                                'problem with linkrole :api:`%s`: can not resolve '
+                                'dotted name %s' % (text, dotted_name,))
+                return (text, apigen_relpath + 'api/%s.html' % (dotted_name,))
+        elif name == 'source':
+            assert text.startswith('py/'), ('source link "%s" does not point '
+                                            'to the py package') % (text,)
+            relpath = '/'.join(text.split('/')[1:])
+            if check:
+                pkgroot = py._pydir
+                abspath = pkgroot.join(relpath)
+                assert pkgroot.join(relpath).check(), (
+                        'problem with linkrole :source:`%s`: '
+                        'path %s does not exist' % (text, relpath))
+            if relpath.endswith('/') or not relpath:
+                relpath += 'index.html'
+            else:
+                relpath += '.html'
+            return (text, apigen_relpath + 'source/%s' % (relpath,))
+        elif name == 'ref':
+            return ("", "")
+
+    def _checkskip(self, lpath, htmlpath=None):
+        if not self.config.getvalue("forcegen"):
+            lpath = py.path.local(lpath)
+            if htmlpath is not None:
+                htmlpath = py.path.local(htmlpath)
+            if lpath.ext == '.txt':
+                htmlpath = htmlpath or lpath.new(ext='.html')
+                if htmlpath.check(file=1) and htmlpath.mtime() >= lpath.mtime():
+                    py.test.skip("html file is up to date, use --forcegen to regenerate")
+                    #return [] # no need to rebuild
+
+class DoctestText(py.test.collect.Item):
+    def reportinfo(self):
+        return self.fspath, None, "doctest"
+
+    def runtest(self):
+        content = self._normalize_linesep()
+        newcontent = self.config.hook.pytest_doctest_prepare_content(content=content)
+        if newcontent is not None:
+            content = newcontent
+        s = content
+        l = []
+        prefix = '.. >>> '
+        mod = py.std.types.ModuleType(self.fspath.purebasename)
+        skipchunk = False
+        for line in deindent(s).split('\n'):
+            stripped = line.strip()
+            if skipchunk and line.startswith(skipchunk):
+                py.builtin.print_("skipping", line)
+                continue
+            skipchunk = False
+            if stripped.startswith(prefix):
+                try:
+                    py.builtin.exec_(py.code.Source(
+                            stripped[len(prefix):]).compile(),  mod.__dict__)
+                except ValueError:
+                    e = sys.exc_info()[1]
+                    if e.args and e.args[0] == "skipchunk":
+                        skipchunk = " " * (len(line) - len(line.lstrip()))
+                    else:
+                        raise
+            else:
+                l.append(line)
+        docstring = "\n".join(l)
+        mod.__doc__ = docstring
+        failed, tot = py.std.doctest.testmod(mod, verbose=1)
+        if failed:
+            py.test.fail("doctest %s: %s failed out of %s" %(
+                         self.fspath, failed, tot))
+
+    def _normalize_linesep(self):
+        # XXX quite nasty... but it works (fixes win32 issues)
+        s = self.fspath.read()
+        linesep = '\n'
+        if '\r' in s:
+            if '\n' not in s:
+                linesep = '\r'
+            else:
+                linesep = '\r\n'
+        s = s.replace(linesep, '\n')
+        return s
+
+class LinkCheckerMaker(py.test.collect.Collector):
+    def collect(self):
+        return list(self.genlinkchecks())
+
+    def genlinkchecks(self):
+        path = self.fspath
+        # generating functions + args as single tests
+        timeout = self.config.getvalue("urlcheck_timeout")
+        for lineno, line in enumerate(path.readlines()):
+            line = line.strip()
+            if line.startswith('.. _'):
+                if line.startswith('.. _`'):
+                    delim = '`:'
+                else:
+                    delim = ':'
+                l = line.split(delim, 1)
+                if len(l) != 2:
+                    continue
+                tryfn = l[1].strip()
+                name = "%s:%d" %(tryfn, lineno)
+                if tryfn.startswith('http:') or tryfn.startswith('https'):
+                    if self.config.getvalue("urlcheck"):
+                        yield CheckLink(name, parent=self,
+                            args=(tryfn, path, lineno, timeout), checkfunc=urlcheck)
+                elif tryfn.startswith('webcal:'):
+                    continue
+                else:
+                    i = tryfn.find('#')
+                    if i != -1:
+                        checkfn = tryfn[:i]
+                    else:
+                        checkfn = tryfn
+                    if checkfn.strip() and (1 or checkfn.endswith('.html')):
+                        yield CheckLink(name, parent=self,
+                            args=(tryfn, path, lineno), checkfunc=localrefcheck)
+
+class CheckLink(py.test.collect.Item):
+    def __init__(self, name, parent, args, checkfunc):
+        super(CheckLink, self).__init__(name, parent)
+        self.args = args
+        self.checkfunc = checkfunc
+
+    def runtest(self):
+        return self.checkfunc(*self.args)
+
+    def reportinfo(self, basedir=None):
+        return (self.fspath, self.args[2], "checklink: %s" % self.args[0])
+
+def urlcheck(tryfn, path, lineno, TIMEOUT_URLOPEN):
+    old = py.std.socket.getdefaulttimeout()
+    py.std.socket.setdefaulttimeout(TIMEOUT_URLOPEN)
+    try:
+        try:
+            py.builtin.print_("trying remote", tryfn)
+            py.std.urllib2.urlopen(tryfn)
+        finally:
+            py.std.socket.setdefaulttimeout(old)
+    except (py.std.urllib2.URLError, py.std.urllib2.HTTPError):
+        e = sys.exc_info()[1]
+        if getattr(e, 'code', None) in (401, 403): # authorization required, forbidden
+            py.test.skip("%s: %s" %(tryfn, str(e)))
+        else:
+            py.test.fail("remote reference error %r in %s:%d\n%s" %(
+                         tryfn, path.basename, lineno+1, e))
+
+def localrefcheck(tryfn, path, lineno):
+    # assume it should be a file
+    i = tryfn.find('#')
+    if tryfn.startswith('javascript:'):
+        return # don't check JS refs
+    if i != -1:
+        anchor = tryfn[i+1:]
+        tryfn = tryfn[:i]
+    else:
+        anchor = ''
+    fn = path.dirpath(tryfn)
+    ishtml = fn.ext == '.html'
+    fn = ishtml and fn.new(ext='.txt') or fn
+    py.builtin.print_("filename is", fn)
+    if not fn.check(): # not ishtml or not fn.check():
+        if not py.path.local(tryfn).check(): # the html could be there
+            py.test.fail("reference error %r in %s:%d" %(
+                          tryfn, path.basename, lineno+1))
+    if anchor:
+        source = unicode(fn.read(), 'latin1')
+        source = source.lower().replace('-', ' ') # aehem
+
+        anchor = anchor.replace('-', ' ')
+        match2 = ".. _`%s`:" % anchor
+        match3 = ".. _%s:" % anchor
+        candidates = (anchor, match2, match3)
+        py.builtin.print_("candidates", repr(candidates))
+        for line in source.split('\n'):
+            line = line.strip()
+            if line in candidates:
+                break
+        else:
+            py.test.fail("anchor reference error %s#%s in %s:%d" %(
+                tryfn, anchor, path.basename, lineno+1))
+
+if hasattr(sys.stdout, 'fileno') and os.isatty(sys.stdout.fileno()):
+    def log(msg):
+        print(msg)
+else:
+    def log(msg):
+        pass
+
+def convert_rest_html(source, source_path, stylesheet=None, encoding='latin1'):
+    """ return html latin1-encoded document for the given input.
+        source  a ReST-string
+        sourcepath where to look for includes (basically)
+        stylesheet path (to be used if any)
+    """
+    from docutils.core import publish_string
+    kwargs = {
+        'stylesheet' : stylesheet,
+        'stylesheet_path': None,
+        'traceback' : 1,
+        'embed_stylesheet': 0,
+        'output_encoding' : encoding,
+        #'halt' : 0, # 'info',
+        'halt_level' : 2,
+    }
+    # docutils uses os.getcwd() :-(
+    source_path = os.path.abspath(str(source_path))
+    prevdir = os.getcwd()
+    try:
+        #os.chdir(os.path.dirname(source_path))
+        return publish_string(source, source_path, writer_name='html',
+                              settings_overrides=kwargs)
+    finally:
+        os.chdir(prevdir)
+
+def process(txtpath, encoding='latin1'):
+    """ process a textfile """
+    log("processing %s" % txtpath)
+    assert txtpath.check(ext='.txt')
+    if isinstance(txtpath, py.path.svnwc):
+        txtpath = txtpath.localpath
+    htmlpath = txtpath.new(ext='.html')
+    #svninfopath = txtpath.localpath.new(ext='.svninfo')
+
+    style = txtpath.dirpath('style.css')
+    if style.check():
+        stylesheet = style.basename
+    else:
+        stylesheet = None
+    content = unicode(txtpath.read(), encoding)
+    doc = convert_rest_html(content, txtpath, stylesheet=stylesheet, encoding=encoding)
+    htmlpath.open('wb').write(doc)
+    #log("wrote %r" % htmlpath)
+    #if txtpath.check(svnwc=1, versioned=1):
+    #    info = txtpath.info()
+    #    svninfopath.dump(info)
+
+if sys.version_info > (3, 0):
+    def _uni(s): return s
+else:
+    def _uni(s):
+        return unicode(s)
+
+rex1 = re.compile(r'.*<body>(.*)</body>.*', re.MULTILINE | re.DOTALL)
+rex2 = re.compile(r'.*<div class="document">(.*)</div>.*', re.MULTILINE | re.DOTALL)
+
+def strip_html_header(string, encoding='utf8'):
+    """ return the content of the body-tag """
+    uni = unicode(string, encoding)
+    for rex in rex1,rex2:
+        match = rex.search(uni)
+        if not match:
+            break
+        uni = match.group(1)
+    return uni
+
+class Project: # used for confrest.py files
+    def __init__(self, sourcepath):
+        self.sourcepath = sourcepath
+    def process(self, path):
+        return process(path)
+    def get_htmloutputpath(self, path):
+        return path.new(ext='html')
diff --git a/sprintinfo/genova-pegli-2011/directions.txt b/sprintinfo/genova-pegli-2011/directions.txt
new file mode 100644
--- /dev/null
+++ b/sprintinfo/genova-pegli-2011/directions.txt
@@ -0,0 +1,38 @@
+How to go to Genova Pegli
+=========================
+
+By train
+--------
+
+- http://www.trenitalia.com
+
+- Take a long distance train to Genova Piazza Principe or Genova Brignole
+  (both works; in case of doubt, pick Genova Principe as it's slightly closer
+  to Pegli)
+
+- From there, take a regional train to Genova Pegli: take one whose final
+  destination is Genova Voltri, Savona or Ventimiglia.  Beware that not all of
+  those actually stops in Pegli, so make sure that yours does :-) (in case of
+  doubt, you can ask a random person on the platform, they'll know it for
+  sure)
+
+- You can search for the timetable at the trenitalia.com website
+
+- This is the map from the Genova Pegli station to the Hotel: http://maps.google.it/maps?saddr=Genova+Pegli&daddr=Lungomare+di+Pegli,+22,+16155+Genova+(Albergo+Puppo)&hl=it&sll=44.42542,8.81594&sspn=0.001927,0.003793&geocode=FVrkpQId9oeGACllN1h7SD_TEjEhQe02_AQZnQ%3BFYDdpQIdaYGGACHNe85zd7hOuykraHuSRz_TEjHnjlgjZyCfOA&mra=ltm&dirflg=w&z=18
+
+
+By plane
+--------
+
+- http://www.airport.genova.it/v2/
+
+- From the airport, take the "Volabus" until the stop "Via Cornigliano /
+  Stazione FS":
+  http://www.airport.genova.it/v2/index.php?option=com_content&view=article&id=67&Itemid=136&lang=en
+
+- From the Genova Cornigliano train station, take a regional train to Genova
+  Pegli whose final destination is Genova Voltri, Savona or Ventimiglia.  You
+  can use the same ticket as for the Volabus
+
+- Look at the map above for the hotel
+
diff --git a/sprintinfo/genova-pegli-2011/people.txt b/sprintinfo/genova-pegli-2011/people.txt
--- a/sprintinfo/genova-pegli-2011/people.txt
+++ b/sprintinfo/genova-pegli-2011/people.txt
@@ -7,13 +7,17 @@
 available yet from them.
 
 
-==================== ============== =======================
-    Name              Arrive/Depart     Accomodation 
-==================== ============== =======================
-Antonio Cuni         --             lives there
-Laura Creighton      26/6 - 1 or 2/7     double room w Jacob
-Jacob Hallen	     26/6 - 1 or 2/7     double room w Laura
-==================== ============== =======================
+==================== =================== =======================
+    Name              Arrive/Depart          Accomodation 
+==================== =================== =======================
+Antonio Cuni         --                  lives there
+Laura Creighton      26/6 - 2/7          double room w Jacob
+Jacob Hallen         26/6 - 2/7          double room w Laura
+Armin Rigo           26/6 - 3/7          room to share, anyone?
+Romain Guillebert    26/6 - 3/7          willing to share
+Dario Bertini        26/6 - 2 or 3/7     ?
+Christian Tismer     26/6 - 3/7          room to share, anyone?
+==================== =================== =======================
 
 
 People on the following list were present at previous sprints: 
@@ -21,7 +25,6 @@
 ==================== ============== =====================
        Name          Arrive/Depart  Accomodation 
 ==================== ============== =====================
-Armin Rigo           ?              ?
 Michael Foord        ?              ?
 Maciej Fijalkowski   ?              ?
 David Schneider      ?              ?
diff --git a/talk/djangocon.eu2011/Makefile b/talk/djangocon.eu2011/Makefile
new file mode 100644
--- /dev/null
+++ b/talk/djangocon.eu2011/Makefile
@@ -0,0 +1,20 @@
+
+pypy-talk.pdf: talk.rst author.latex title.latex stylesheet.latex
+	rst2beamer --input-encoding=utf-8 --output-encoding=utf-8 --stylesheet=stylesheet.latex --documentoptions=14pt --theme=Warsaw --overlaybullets=False talk.rst pypy-talk.latex || exit
+	sed 's/\\date{}/\\input{author.latex}/' -i pypy-talk.latex || exit
+	sed 's/\\maketitle/\\input{title.latex}/' -i pypy-talk.latex || exit
+	pdflatex pypy-talk.latex  || exit
+
+view: pypy-talk.pdf
+	evince pypy-talk.pdf &
+
+clean:
+	rm -f pypy-talk.swp
+	rm -f pypy-talk.aux
+	rm -f pypy-talk.latex
+	rm -f pypy-talk.log
+	rm -f pypy-talk.nav
+	rm -f pypy-talk.out
+	rm -f pypy-talk.snm
+	rm -f pypy-talk.vrb
+	rm -f pypy-talk.toc
diff --git a/talk/djangocon.eu2011/author.latex b/talk/djangocon.eu2011/author.latex
new file mode 100644
--- /dev/null
+++ b/talk/djangocon.eu2011/author.latex
@@ -0,0 +1,8 @@
+\definecolor{rrblitbackground}{rgb}{0.0, 0.0, 0.0}
+
+\title[PyPy]{Django and PyPy: performant is a word}
+\author[Alex Gaynor]
+{Alex Gaynor}
+
+\institute{DjangoCon.eu 2011}
+\date{6 June 2011}
diff --git a/talk/djangocon.eu2011/pypy-talk.pdf b/talk/djangocon.eu2011/pypy-talk.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4ee298cb121c0c64babf8962267c8d810ee697a7
GIT binary patch

[cut]

diff --git a/talk/djangocon.eu2011/stylesheet.latex b/talk/djangocon.eu2011/stylesheet.latex
new file mode 100644
--- /dev/null
+++ b/talk/djangocon.eu2011/stylesheet.latex
@@ -0,0 +1,10 @@
+\usetheme{Warsaw}
+\setbeamercovered{transparent}
+\setbeamertemplate{navigation symbols}{}
+
+\definecolor{darkgreen}{rgb}{0, 0.5, 0.0}
+\newcommand{\docutilsrolegreen}[1]{\color{darkgreen}#1\normalcolor}
+\newcommand{\docutilsrolered}[1]{\color{red}#1\normalcolor}
+
+\newcommand{\green}[1]{\color{darkgreen}#1\normalcolor}
+\newcommand{\red}[1]{\color{red}#1\normalcolor}
diff --git a/talk/djangocon.eu2011/talk.rst b/talk/djangocon.eu2011/talk.rst
new file mode 100644
--- /dev/null
+++ b/talk/djangocon.eu2011/talk.rst
@@ -0,0 +1,201 @@
+=====================================
+Django and PyPy: performant is a word
+=====================================
+
+Me
+---
+
+* Django and PyPy core developer
+* I like making **your** code faster
+* Working at Quora making their codebase run on PyPy, fast.
+
+What is Django?
+---------------
+
+* Anyone here know?
+
+What is PyPy?
+-------------
+
+* An implementation of Python 2.7.1
+* A very fast implementation
+* A very compliant implementation
+
+What is PyPy? (2)
+-----------------
+
+* Python written in Python
+* Open source (MIT licensed)
+* 8 years old
+* Over 150,000 lines of test code (that's more than all of Django)
+* A successor to Psyco
+
+Fast
+----
+
+* Faster than CPython on almost every benchmark we have.
+* http://speed.pypy.org/
+* A very actively developed project: http://bit.ly/pypy-django-bench
+
+World's shortest introduction to JITing
+---------------------------------------
+
+* Run interpreter
+* Find frequently executed loops
+* Turn those loops into efficient assembler, by specializing for the types
+  of variables and other things.
+
+Case studies
+------------
+
+* Production ready
+* Real people are using this to speed up their apps.
+
+LWN.net
+-------
+
+* Parse the output of ``git log`` and generate data/reports
+* CPython: 63 seconds
+* PyPy: 21 seconds
+
+Some guy on IRC
+---------------
+
+* Query PostgreSQL and generate reports.
+* CPython: 2 minutes
+* PyPy: 8 seconds
+
+Why isn't everyone using PyPy?
+------------------------------
+
+* C extensions
+* C-API tightly coupled to CPython implementation details
+
+Solutions
+---------
+
+* CPyExt
+* Pure Python/``ctypes``
+* Cython (GSOC)
+
+But web apps are I/O bound...
+-----------------------------
+
+* Eh, maybe they should be, but they often aren't.
+
+The Wild Wild Web (WWW for short)
+---------------------------------
+
+* To run a Django site you need a handful of things
+* Web server
+* Database
+* Random other libraries (``PIL``, ``lxml``, etc.)
+
+Web server
+----------
+
+* WSGI
+* Any pure Python server will do
+* I like ``gunicorn``, you can use whatever you like
+* *Not* ``mod_wsgi``
+
+Database
+--------
+
+* Use any database you like, so long as there's an adapter for it that works with both Django and PyPy!
+
+SQLite
+------
+
+* Standard library, just works!
+
+PostgreSQL
+----------
+
+* RPython ``psycopg2`` compatible lib, requires compiling your own PyPy
+* ``pg8000`` and tons of other random libraries, Django doesn't work with them, but if they're pure Python they'll work with other stuff (e.g. SQLAlchemy)
+
+MySQL
+-----
+
+* (various expletives censored)
+* Nothing that works with Django ATM
+* I'm working on a ``ctypes`` based MySQLdb dropin replacement, hopefully open source soonish.
+
+Oracle
+------
+
+* We have an RPython ``cx_Oracle``
+* I know nothing about its status
+
+Other databases
+---------------
+
+* There are other databases?
+* Uhh, talk to me later?
+
+Random other libs
+-----------------
+
+* ``PIL`` - works under CPyExt
+* ``lxml`` - doesn't work :(
+* Others - how should I know?  Others isn't very specific.
+
+Benchmarking!
+-------------
+
+* Lies, damned lies, and statistics!
+* And benchmarks
+* Ignore them, you need to test *your* app.
+* But if you need to convince your boss...
+
+Django template benchmark
+-------------------------
+
+* Part of the Unladen Swallow benchmark suite
+* PyPy 1.5: almost 10x faster than CPython
+* PyPy trunk: almost 12x faster
+* http://bit.ly/pypy-django-bench
+
+Rietveld benchmark
+------------------
+
+* Another part of the Unladen Swallow benchmark suite
+* PyPy trunk: about 1.35x faster than CPython
+
+Tornado web app
+---------------
+
+* 2x as many requests per second
+
+Memory
+------
+
+* Mixed bag.
+* Some apps use more, some use less.
+* Benchmark your own app.
+
+PyPy
+----
+
+* A better platform for developing Python itself
+* A faster Python for your apps
+
+Recruiting
+----------
+
+* We could use some developers/designer to help with our performance tools.
+* We have a cool webbased profiling/analyses tool.
+* Flask/Jinja/jQuery (sorry)
+* Contributors wanted, no compiler experience needed!
+* http://bit.ly/pypy-recruiting
+
+Questions?
+----------
+
+* http://alexgaynor.net/
+* http://pypy.org/
+* #pypy on irc.freenode.net
+* I want to make your apps faster, come talk to me!
+* Thank you!
+* Dank je wel!
diff --git a/talk/djangocon.eu2011/title.latex b/talk/djangocon.eu2011/title.latex
new file mode 100644
--- /dev/null
+++ b/talk/djangocon.eu2011/title.latex
@@ -0,0 +1,5 @@
+\begin{titlepage}
+\begin{figure}[h]
+\scalebox{0.8}{\includegraphics[width=80px]{../img/py-web-new.png}}
+\end{figure}
+\end{titlepage}
diff --git a/talk/rst2beamer-template/Makefile b/talk/ep2011/talk/Makefile
copy from talk/rst2beamer-template/Makefile
copy to talk/ep2011/talk/Makefile
--- a/talk/rst2beamer-template/Makefile
+++ b/talk/ep2011/talk/Makefile
@@ -4,8 +4,8 @@
 # WARNING: to work, it needs this patch for docutils
 # https://sourceforge.net/tracker/?func=detail&atid=422032&aid=1459707&group_id=38414
 
-talk.pdf: talk.txt author.latex title.latex stylesheet.latex
-	rst2beamer.py --stylesheet=stylesheet.latex --documentoptions=14pt talk.txt talk.latex || exit
+talk.pdf: talk.rst author.latex title.latex stylesheet.latex
+	rst2beamer.py --stylesheet=stylesheet.latex --documentoptions=14pt talk.rst talk.latex || exit
 	sed 's/\\date{}/\\input{author.latex}/' -i talk.latex || exit
 	sed 's/\\maketitle/\\input{title.latex}/' -i talk.latex || exit
 	pdflatex talk.latex  || exit
diff --git a/talk/ep2011/talk/Uncle_Sam.png b/talk/ep2011/talk/Uncle_Sam.png
new file mode 100644
index 0000000000000000000000000000000000000000..7373c7dcba402281fae711b9cc5d334c344cb55f
GIT binary patch

[cut]

diff --git a/talk/rst2beamer-template/author.latex b/talk/ep2011/talk/author.latex
copy from talk/rst2beamer-template/author.latex
copy to talk/ep2011/talk/author.latex
--- a/talk/rst2beamer-template/author.latex
+++ b/talk/ep2011/talk/author.latex
@@ -1,8 +1,8 @@
 \definecolor{rrblitbackground}{rgb}{0.0, 0.0, 0.0}
 
-\title[PyPy: becoming fast]{PyPy: becoming fast}
-\author[antocuni, cfbolz, pedronis]
-{Antonio Cuni \\ Carl Friedrich Bolz\\ Samuele Pedroni}
+\title[PyPy in Production]{PyPy in Production}
+\author[antocuni, arigo]
+{Antonio Cuni \\ Armin Rigo}
 
-\institute{EuroPython 2009}
-\date{June 30 2009}
+\institute{EuroPython 2011}
+\date{June 23 2011}
diff --git a/talk/rst2beamer-template/beamerdefs.txt b/talk/ep2011/talk/beamerdefs.txt
copy from talk/rst2beamer-template/beamerdefs.txt
copy to talk/ep2011/talk/beamerdefs.txt
--- a/talk/rst2beamer-template/beamerdefs.txt
+++ b/talk/ep2011/talk/beamerdefs.txt
@@ -20,6 +20,17 @@
 
    }
 
+.. |scriptsize| raw:: latex
+
+   {\scriptsize
+
+.. |end_scriptsize| raw:: latex
+
+   }
+
+.. |strike<| raw:: latex
+
+   \sout{
 
 .. closed bracket
 .. ===========================
@@ -75,3 +86,23 @@
 
       \end{column}
    \end{columns}
+
+
+
+.. |snake| image:: ../../img/py-web-new.png
+           :scale: 15%
+           
+
+
+.. nested blocks
+.. ===========================
+
+.. |nested| raw:: latex
+
+   \begin{columns}
+      \begin{column}{0.85\textwidth}
+
+.. |end_nested| raw:: latex
+
+      \end{column}
+   \end{columns}
diff --git a/talk/ep2011/talk/ctypesbench.py b/talk/ep2011/talk/ctypesbench.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/talk/ctypesbench.py
@@ -0,0 +1,24 @@
+import time
+N = 10000000
+
+def main(N):
+    import ctypes
+    libm = ctypes.CDLL('libm.so')
+    pow = libm.pow
+    pow.argtypes = [ctypes.c_double, ctypes.c_double]
+    pow.restype = ctypes.c_double
+    #
+    i = 0
+    res = 0
+    start = time.clock()
+    while i < N:
+        res += pow(2, 3)
+        i += 1
+    end = time.clock()
+    print 'total:', end-start
+    if hasattr(pow, '_ptr'):
+        print 'address:', pow._ptr.getaddr()
+    return res
+
+
+main(N)
diff --git a/talk/ep2011/talk/demo.png b/talk/ep2011/talk/demo.png
new file mode 100644
index 0000000000000000000000000000000000000000..80c49b0baf4121a5c6c0623b91c5daa28f8afbbd
GIT binary patch

[cut]

diff --git a/talk/ep2011/talk/django-last-year.png b/talk/ep2011/talk/django-last-year.png
new file mode 100644
index 0000000000000000000000000000000000000000..339e57211b180b7d4e389819eddb1c530849d35d
GIT binary patch

[cut]

diff --git a/talk/ep2011/talk/django-vs-cpython.png b/talk/ep2011/talk/django-vs-cpython.png
new file mode 100644
index 0000000000000000000000000000000000000000..a99dae4063d20dd21d0824ad5ad5361a7cfcc433
GIT binary patch

[cut]

diff --git a/talk/ep2011/talk/pypy-vs-cpython.png b/talk/ep2011/talk/pypy-vs-cpython.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8bbda5aa40810162c77e63e499a0cdaac8ce3b1
GIT binary patch

[cut]

diff --git a/talk/ep2011/talk/question-mark.png b/talk/ep2011/talk/question-mark.png
new file mode 100644
index 0000000000000000000000000000000000000000..c15378b85f7ba141ed6dd631c8b249da91003538
GIT binary patch

[cut]

diff --git a/talk/ep2011/talk/rational.c b/talk/ep2011/talk/rational.c
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/talk/rational.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+int main()
+{
+    float px = 0.0, py = 0.0;
+    while (px < 2000.0) {
+        px += 1.0;
+        py += 0.5;
+    }
+    printf("%f %f\n", px, py);
+}
diff --git a/talk/ep2011/talk/rational.py b/talk/ep2011/talk/rational.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/talk/rational.py
@@ -0,0 +1,21 @@
+class Point(object):
+
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+    def __add__(self, other):
+        if not isinstance(other, Point):
+            raise TypeError
+        x1 = self.x + other.x
+        y1 = self.y + other.y
+        return Point(x1, y1)
+
+def main():
+    p = Point(0.0, 0.0)
+    while p.x < 2000.0:
+        p = p + Point(1.0, 0.5)
+    print p.x, p.y
+
+main()
+
diff --git a/talk/rst2beamer-template/stylesheet.latex b/talk/ep2011/talk/stylesheet.latex
copy from talk/rst2beamer-template/stylesheet.latex
copy to talk/ep2011/talk/stylesheet.latex
--- a/talk/rst2beamer-template/stylesheet.latex
+++ b/talk/ep2011/talk/stylesheet.latex
@@ -1,4 +1,6 @@
+\usepackage{ulem}
 \usetheme{Boadilla}
+\usecolortheme{whale}
 \setbeamercovered{transparent}
 \setbeamertemplate{navigation symbols}{}
 
diff --git a/talk/ep2011/talk/talk.pdf b/talk/ep2011/talk/talk.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c5e303544d4b86bf04c73c4111c2d283bcce39a2
GIT binary patch

[cut]

diff --git a/talk/rst2beamer-template/talk.pdf.info b/talk/ep2011/talk/talk.pdf.info
copy from talk/rst2beamer-template/talk.pdf.info
copy to talk/ep2011/talk/talk.pdf.info
diff --git a/talk/rst2beamer-template/talk.txt b/talk/ep2011/talk/talk.rst
copy from talk/rst2beamer-template/talk.txt
copy to talk/ep2011/talk/talk.rst
--- a/talk/rst2beamer-template/talk.txt
+++ b/talk/ep2011/talk/talk.rst
@@ -1,7 +1,589 @@
 .. include:: beamerdefs.txt
 
 ================================
-Title
+PyPy in production
 ================================
 
-XXX
+What is PyPy?
+-------------
+
+|pause|
+
+* Past EuroPython talks:
+
+  - |scriptsize| **2004**: PyPy
+
+  - **2005**: PyPy as a compiler
+
+  - **2006**: An introduction to PyPy, PyPy architecture session, What can PyPy do for you
+
+  - **2007**: PyPy 1.0 and Beyond, PyPy Python Interpreter(s) Features, PyPy: Why and
+    how did it (not) work?
+
+  - **2008**: PyPy for the rest of us, PyPy status talk
+
+  - **2009** PyPy: Complete and Fast
+
+  - **2010**: PyPy 1.3: Status and News |end_scriptsize|
+
+|pause|
+
+* You should know by now :-)
+
+What is PyPy? (seriously)
+-------------------------
+
+* PyPy
+
+  - started in 2003
+
+  - Open Source, partially funded by EU and others
+
+  - framework for fast dynamic languages
+
+  - **Python implementation**
+
+* as a Python dev, you care about the latter
+
+
+PyPy 1.5
+---------
+
+* Released on 30 April, 2011
+
+* Python 2.7.1
+
+* The most compatible alternative to CPython
+
+* Most programs just work
+
+* (C extensions might not)
+
+|pause|
+
+* **fast**
+
+
+PyPy features
+---------------
+
+* JIT
+
+  - automatically generated
+
+  - complete/correct by construction
+
+  - multiple backends: x86-32, x86-64, ARM
+
+|pause|
+
+* Stackless
+
+  - not yet integrated with the JIT (in-progress)
+
+|pause|
+
+* cpyext
+
+  - CPython C-API compatibility layer
+
+  - not always working
+
+  - often working: wxPython, PIL, cx_Oracle, mysqldb, pycairo, ...
+
+|pause|
+
+* compact instances (as using ``__slots__``)
+
+
+Speed
+------
+
+.. image:: pypy-vs-cpython.png
+   :scale: 40%
+   :align: center
+
+
+Improvements in the past year
+------------------------------
+
+.. image:: django-last-year.png
+   :scale: 38%
+   :align: center
+
+
+Compare to CPython
+-------------------
+
+.. image:: django-vs-cpython.png
+   :scale: 38%
+   :align: center
+
+
+Real world use case (1)
+-----------------------
+
+* LWN's gitdm
+
+  - http://lwn.net/Articles/442268/
+
+  - data mining tool
+
+  - reads the output of ``git log``
+
+  - generate kernel development statistics
+
+|pause|
+
+* Performance
+
+  - CPython: 63 seconds
+
+  - PyPy: **21 seconds**
+
+|pause|
+
+|example<| ``lwn.net`` |>|
+|small|
+
+  [...] PyPy is ready for prime time; it implements the (Python 2.x)
+  language faithfully, and it is fast.
+
+|end_small|
+|end_example|
+
+
+Real world use case (2)
+-----------------------
+
+* **MyHDL**: VHDL-like language written in Python
+
+  - |scriptsize| http://www.myhdl.org/doku.php/performance |end_scriptsize|
+
+  - (now) competitive with "real world" VHDL and Verilog simulators
+
+
+|pause|
+
+|example<| ``myhdl.org`` |>|
+|small|
+
+  [...] the results are spectacular. By simply using a different interpreter,
+  our simulations run 6 to 12 times faster.
+
+|end_small|
+|end_example|
+
+
+
+Real world use case (3)
+-----------------------
+
+- Translating PyPy itself
+
+- Huge, complex piece of software
+
+- All possible (and impossible :-)) kinds of dynamic and metaprogrammig tricks
+
+- ~2.5x faster with PyPy
+
+- (slow warm-up phase, though)
+
+- Ouroboros! |snake|
+
+
+Real world use case (4)
+-----------------------
+
+.. image:: Uncle_Sam.png
+   :scale: 50%
+   :align: center
+
+* Your own application
+
+* Try PyPy, it might be worth it
+
+
+Not convinced yet?
+------------------
+
+|example<| Real time edge detection |>|
+|small|
+
+.. sourcecode:: python
+
+    def sobeldx(img):
+      res = img.clone(typecode='d')
+      for p in img.pixeliter():
+          res[p] = (-1.0 * img[p + (-1,-1)] +
+                     1.0 * img[p + ( 1,-1)] +
+                    -2.0 * img[p + (-1, 0)] +
+                     2.0 * img[p + ( 1, 0)] +
+                    -1.0 * img[p + (-1, 1)] +
+                     1.0 * img[p + ( 1, 1)]) / 4.0
+      return res
+    ...
+    ...
+
+|end_small|
+|end_example|
+
+Live demo
+---------
+
+.. image:: demo.png
+   :scale: 38%
+   :align: center
+
+
+Is Python slow?
+----------------
+
+- |strike<| Python is slow |>|
+
+- Python is hard to optimize
+
+|pause|
+
+- Huge stack of layers over the bare metal
+
+- Abstraction has a cost |pause| (... or not?)
+
+
+Python is complicated
+---------------------
+
+How ``a + b`` works (simplified!):
+
+* look up the method ``__add__`` on the type of a
+
+* if there is one, call it
+
+* if it returns NotImplemented, or if there is none,
+  look up the method ``__radd__`` on the type of b
+
+* if there is one, call it
+
+* if there is none, or we get ``NotImplemented`` again,
+  raise an exception ``TypeError``
+
+
+Python is a mess
+----------------
+
+How ``obj.attr`` or ``obj.method()`` works:
+
+* ...
+
+|pause|
+
+* no way to write it down in just one slide
+
+
+Killing the abstraction overhead
+--------------------------------
+
+|scriptsize|
+|column1|
+|example<| Python |>|
+
+.. sourcecode:: python
+
+    class Point(object):
+
+      def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+      def __add__(self, q):
+        if not isinstance(q, Point):
+          raise TypeError
+        x1 = self.x + q.x
+        y1 = self.y + q.y
+        return Point(x1, y1)
+
+    def main():
+      p = Point(0.0, 0.0)
+      while p.x < 2000.0:
+        p = p + Point(1.0, 0.5)
+      print p.x, p.y
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| C |>|
+
+.. sourcecode:: c
+
+   #include <stdio.h>
+
+
+
+
+
+
+
+    
+
+    int main() {
+        float px = 0.0, py = 0.0;
+        while (px < 2000.0) {
+            px += 1.0;
+            py += 0.5;
+        }
+        printf("%f %f\n", px, py);
+    }
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+.. at this point, we show it in the jitviewer
+
+Pointless optimization techniques
+---------------------------------
+
+.. XXX: I'm not sure how useful is this slide
+
+|scriptsize|
+
+|column1|
+|example<| |>|
+
+.. sourcecode:: python
+   
+   #
+   for item in some_large_list:
+       self.meth(item)
+
+|end_example|
+|column2|
+|example<| |>|
+
+.. sourcecode:: python
+
+   meth = self.meth
+   for item in some_large_list:
+       meth(item)
+
+
+|end_example|
+|end_columns|
+
+|pause|
+
+|column1|
+|example<| |>|
+
+.. sourcecode:: python
+   
+   def foo():
+       res = 0
+       for item in some_large_list:
+           res = res + abs(item)
+       return res
+
+|end_example|
+|column2|
+|example<| |>|
+
+.. sourcecode:: python
+
+   def foo(abs=abs):
+       res = 0
+       for item in some_large_list:
+           res = res + abs(item)
+       return res
+
+|end_example|
+|end_columns|
+
+|pause|
+
+|column1|
+|example<| |>|
+
+.. sourcecode:: python
+
+   #
+
+   [i**2 for i in range(100)]
+
+|end_example|
+|column2|
+|example<| |>|
+
+.. sourcecode:: python
+
+   from itertools import *
+   list(imap(pow, count(0), 
+             repeat(2, 100)))
+
+|end_example|
+|end_columns|
+
+|pause|
+
+|column1|
+|example<| |>|
+
+.. sourcecode:: python
+
+   for i in range(large_number):
+       ...
+
+|end_example|
+|column2|
+|example<| |>|
+
+.. sourcecode:: python
+
+   for i in xrange(large_number):
+       ...
+
+|end_example|
+|end_columns|
+
+|pause|
+
+|column1|
+|example<| |>|
+
+.. sourcecode:: python
+
+   class A(object):
+       pass
+
+|end_example|
+|column2|
+|example<| |>|
+
+.. sourcecode:: python
+
+   class A(object):
+       __slots__ = ['a', 'b', 'c']
+
+|end_example|
+|end_columns|
+
+|end_scriptsize|
+
+
+Concrete example: ``ctypes``
+----------------------------
+
+|scriptsize|
+|example<| |>|
+
+.. sourcecode:: python
+
+    import ctypes
+    libm = ctypes.CDLL('libm.so')
+    pow = libm.pow
+    pow.argtypes = [ctypes.c_double, ctypes.c_double]
+    pow.restype = ctypes.c_double
+    pow(2, 3) # <---
+
+|end_example|
+|end_scriptsize|
+
+Layers and layers
+----------------------------
+
+.. raw:: latex
+
+   \setbeamercovered{invisible}
+
+
+|scriptsize|
+
+|example<| |small| ``CFuncPtrFast.__call__`` (Python) |end_small| |>|
+check that the cache is still valid |pause|
+
+|nested| |example<| |small| ``CFuncPtrFast._call_funcptr`` (Python) |end_small| |>|
+some runtime checks (e.g. ``_flags_``) |pause|
+
+|nested| |example<| |small| ``_ffi.FuncPtr.__call__`` (RPython) |end_small| |>|
+typecheck/unbox arguments, put them in raw C buffers |pause|
+
+|nested| |example<| |small| ``c_ffi_call`` (C) [libffi.so] |end_small| |>|
+takes arguments from the raw C buffers |pause|
+
+|nested| |alert<| |small| ``pow at 0xf72de000`` (C) [libm.so]  |end_small| |>|
+return 8
+
+|end_alert| |end_nested|
+|end_example| |end_nested|
+|end_example| |end_nested|
+|end_example| |end_nested|
+|end_example|
+
+|end_scriptsize|
+
+``ctypes`` demo
+----------------
+
+Conclusion
+--------------
+
+- PyPy is fast
+
+- mature
+
+- stable
+
+- abstractions for free!
+
+|pause|
+
+- (I wonder why you all are still here instead of busy trying PyPy :-))
+
+  * not all C extensions are supported (numpy anyone?)
+
+  * too much memory (sometimes)
+
+
+How to help PyPy?
+-----------------
+
+* Try it on your application
+
+  - if it's slow, we want to know!
+
+  - if it does not work, too :-)
+
+  - if it works and it's fast, that as well
+
+* Tell people about PyPy
+
+* Contribute to PyPy! (it's not **that** hard :-))
+
+|pause|
+
+* Give us money, to make PyPy better
+
+  - donations
+
+  - per feature contracts
+
+  - consultancy (hire us to speed up your code)
+
+  - support contracts
+
+
+Contacts, Q/A
+--------------
+
+- http://pypy.org
+
+- blog: http://morepypy.blogspot.com
+
+- mailing list: pypy-dev (at) python.org
+
+- IRC: #pypy on freenode
+
+.. image:: question-mark.png
+   :scale: 10%
+   :align: center
diff --git a/talk/rst2beamer-template/title.latex b/talk/ep2011/talk/title.latex
copy from talk/rst2beamer-template/title.latex
copy to talk/ep2011/talk/title.latex
--- a/talk/rst2beamer-template/title.latex
+++ b/talk/ep2011/talk/title.latex
@@ -1,5 +1,5 @@
 \begin{titlepage}
 \begin{figure}[h]
-\includegraphics[width=80px]{../img/py-web.png}
+\includegraphics[width=60px]{../../img/py-web-new.png}
 \end{figure}
 \end{titlepage}
diff --git a/talk/rst2beamer-template/Makefile b/talk/ep2011/training/Makefile
copy from talk/rst2beamer-template/Makefile
copy to talk/ep2011/training/Makefile
--- a/talk/rst2beamer-template/Makefile
+++ b/talk/ep2011/training/Makefile
@@ -4,12 +4,18 @@
 # WARNING: to work, it needs this patch for docutils
 # https://sourceforge.net/tracker/?func=detail&atid=422032&aid=1459707&group_id=38414
 
-talk.pdf: talk.txt author.latex title.latex stylesheet.latex
-	rst2beamer.py --stylesheet=stylesheet.latex --documentoptions=14pt talk.txt talk.latex || exit
+talk.pdf: talk.rst author.latex title.latex stylesheet.latex
+	rst2beamer.py --stylesheet=stylesheet.latex --documentoptions=14pt talk.rst talk.latex || exit
 	sed 's/\\date{}/\\input{author.latex}/' -i talk.latex || exit
 	sed 's/\\maketitle/\\input{title.latex}/' -i talk.latex || exit
 	pdflatex talk.latex  || exit
 
+teaser.pdf: teaser.rst author.latex title.latex stylesheet.latex
+	rst2beamer.py --stylesheet=stylesheet.latex --documentoptions=14pt teaser.rst teaser.latex || exit
+	sed 's/\\date{}/\\input{author.latex}/' -i teaser.latex || exit
+	sed 's/\\maketitle/\\input{title.latex}/' -i teaser.latex || exit
+	pdflatex teaser.latex  || exit
+
 view: talk.pdf
 	evince talk.pdf &
 
diff --git a/talk/rst2beamer-template/author.latex b/talk/ep2011/training/author.latex
copy from talk/rst2beamer-template/author.latex
copy to talk/ep2011/training/author.latex
--- a/talk/rst2beamer-template/author.latex
+++ b/talk/ep2011/training/author.latex
@@ -1,8 +1,8 @@
 \definecolor{rrblitbackground}{rgb}{0.0, 0.0, 0.0}
 
-\title[PyPy: becoming fast]{PyPy: becoming fast}
-\author[antocuni, cfbolz, pedronis]
-{Antonio Cuni \\ Carl Friedrich Bolz\\ Samuele Pedroni}
+\title[PyPy training session]{PyPy training session}
+\author[antocuni, arigo]
+{Antonio Cuni \\ Armin Rigo}
 
-\institute{EuroPython 2009}
-\date{June 30 2009}
+\institute{EuroPython 2011}
+\date{June 20 2011}
diff --git a/talk/rst2beamer-template/beamerdefs.txt b/talk/ep2011/training/beamerdefs.txt
copy from talk/rst2beamer-template/beamerdefs.txt
copy to talk/ep2011/training/beamerdefs.txt
--- a/talk/rst2beamer-template/beamerdefs.txt
+++ b/talk/ep2011/training/beamerdefs.txt
@@ -20,6 +20,17 @@
 
    }
 
+.. |scriptsize| raw:: latex
+
+   {\scriptsize
+
+.. |end_scriptsize| raw:: latex
+
+   }
+
+.. |strike<| raw:: latex
+
+   \sout{
 
 .. closed bracket
 .. ===========================
@@ -75,3 +86,23 @@
 
       \end{column}
    \end{columns}
+
+
+
+.. |snake| image:: ../../img/py-web-new.png
+           :scale: 15%
+           
+
+
+.. nested blocks
+.. ===========================
+
+.. |nested| raw:: latex
+
+   \begin{columns}
+      \begin{column}{0.85\textwidth}
+
+.. |end_nested| raw:: latex
+
+      \end{column}
+   \end{columns}
diff --git a/talk/ep2011/training/preparation.rst b/talk/ep2011/training/preparation.rst
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/preparation.rst
@@ -0,0 +1,37 @@
+================================
+PyPy training session
+================================
+
+You are encouraged to bring your laptop to the training session.
+
+Make sure that the following prerequisites are met:
+
+  * Install PyPy 1.5:
+
+    - http://pypy.org/download.html
+
+    - http://doc.pypy.org/en/latest/getting-started.html#installing-pypy
+
+  * Make sure that ``setuptools`` or ``distribute`` are installed (look at the
+    URL above for instructions)
+
+  * Clone the pypy repository, and update to the 1.5 version::
+
+    $ hg clone http://bitbucket.org/pypy/pypy
+
+    $ cd pypy
+
+    $ hg up -r release-1.5
+
+  * Clone the jitviewer repository and install it on pypy::
+
+    $ hg clone http://bitbucket.org/pypy/jitviewer
+    
+    $ cd jitviewer
+
+    $ /path/to/pypy-1.5/bin/pypy setup.py develop
+
+If you intend to follow also the second part ("Write your own interpreter with
+PyPy"), you need to make sure you have a working developing environment:
+http://doc.pypy.org/en/latest/getting-started-python.html#translating-the-pypy-python-interpreter
+
diff --git a/talk/ep2011/training/src/count.py b/talk/ep2011/training/src/count.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/src/count.py
@@ -0,0 +1,23 @@
+import sys
+import time
+
+def count_mult_of_5(N):
+    mult = 0
+    not_mult = 0
+    for i in range(N):
+        if i % 5 == 0:
+            mult += 1
+        else:
+            not_mult += 1
+    return mult, not_mult
+
+def main():
+    N = int(sys.argv[1])
+    start = time.clock()
+    count = count_mult_of_5(N)
+    end = time.clock()
+    print 'count: ', count
+    print 'time:', end-start, 'secs'
+
+if __name__ == '__main__':
+    main()
diff --git a/talk/ep2011/training/src/gc0.py b/talk/ep2011/training/src/gc0.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/src/gc0.py
@@ -0,0 +1,7 @@
+def foo():
+    f = file('/tmp/bar.txt', 'w')
+    f.write('hello world')
+    return
+
+foo()
+print file('/tmp/bar.txt').read()
diff --git a/talk/ep2011/training/src/gc1.py b/talk/ep2011/training/src/gc1.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/src/gc1.py
@@ -0,0 +1,8 @@
+def foo():
+    f = file('/tmp/bar.txt', 'w')
+    f.write('hello world')
+    f.close()
+    return
+
+foo()
+print file('/tmp/bar.txt').read()
diff --git a/talk/ep2011/training/src/gc2.py b/talk/ep2011/training/src/gc2.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/src/gc2.py
@@ -0,0 +1,6 @@
+def foo():
+    with file('/tmp/bar.txt', 'w') as f:
+        f.write('hello world')
+
+foo()
+print file('/tmp/bar.txt').read()
diff --git a/talk/ep2011/training/src/html_fibo.py b/talk/ep2011/training/src/html_fibo.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2011/training/src/html_fibo.py
@@ -0,0 +1,47 @@
+"""
+The most complicate ever way to produce an HTML list of fibonacci numbers
+"""
+
+def fibo():
+    a, b = 1, 1
+    while True:
+        yield a
+        a, b = b, a+b
+
+
+class HtmlTag(object):
+    def __init__(self, f, indent, tag):
+        self.f = f
+        self.tag = tag
+        self.f.write(' ' * indent)
+        self.f.write('<%s>' % tag)
+
+    def __del__(self):
+        self.f.write('</%s>\n' % self.tag)
+
+def html_fibo(f):
+    f.write('<ul>\n')
+    try:
+        for n in fibo():
+            tag = HtmlTag(f, 4, 'li')
+            yield n
+            tag = None
+    finally:
+        tag = None
+        f.write('</ul>\n')
+
+
+def write_file():
+    f = open('fibo.txt', 'w')
+    for n in html_fibo(f):
+        f.write('%d' % n)
+        if n > 100:
+            break
+
+def main():
+    write_file()
+    content = open('fibo.txt').read()
+    print content
+
+if __name__ == '__main__':
+    main()
diff --git a/talk/rst2beamer-template/stylesheet.latex b/talk/ep2011/training/stylesheet.latex
copy from talk/rst2beamer-template/stylesheet.latex
copy to talk/ep2011/training/stylesheet.latex
--- a/talk/rst2beamer-template/stylesheet.latex
+++ b/talk/ep2011/training/stylesheet.latex
@@ -1,4 +1,6 @@
+\usepackage{ulem}
 \usetheme{Boadilla}
+\usecolortheme{whale}
 \setbeamercovered{transparent}
 \setbeamertemplate{navigation symbols}{}
 
diff --git a/talk/ep2011/training/talk.pdf b/talk/ep2011/training/talk.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..5dcb970c3060f632acdb23523f1b4700ac8a87da
GIT binary patch

[cut]

diff --git a/talk/rst2beamer-template/talk.pdf.info b/talk/ep2011/training/talk.pdf.info
copy from talk/rst2beamer-template/talk.pdf.info
copy to talk/ep2011/training/talk.pdf.info
diff --git a/talk/rst2beamer-template/talk.txt b/talk/ep2011/training/talk.rst
copy from talk/rst2beamer-template/talk.txt
copy to talk/ep2011/training/talk.rst
--- a/talk/rst2beamer-template/talk.txt
+++ b/talk/ep2011/training/talk.rst
@@ -1,7 +1,216 @@
 .. include:: beamerdefs.txt
 
 ================================
-Title
+PyPy training session
 ================================
 
-XXX
+PyPy training session
+---------------------
+
+- Part 1: Run your application under PyPy
+
+- Part 2: Write your own interpreter with PyPy
+
+
+Part 1
+------
+
+* Run your application under PyPy
+
+
+How to run PyPy
+----------------
+
+* ``pypy program.py``
+
+* That's it!
+
+  - (modulo details)
+
+Challenge
+---------
+
+* ``html_fibo.py``
+
+* HTML list of fibonacci numbers
+
+* (the most complicate ever)
+
+* run it on CPython
+
+* run it on PyPy
+
+* fix it!
+
+
+Refcounting vs generational GC (1)
+----------------------------------
+
+|scriptsize|
+|example<| |scriptsize| ``gc0.py`` |end_scriptsize| |>|
+
+.. sourcecode:: python
+
+   def foo():
+       f = file('/tmp/bar.txt', 'w')
+       f.write('hello world')
+
+   foo()
+   print file('/tmp/bar.txt').read()
+
+|end_example|
+
+|pause|
+|example<| |scriptsize| ``gc1.py`` |end_scriptsize| |>|
+
+.. sourcecode:: python
+
+   def foo():
+       f = file('/tmp/bar.txt', 'w')
+       f.write('hello world')
+       f.close() # <-------
+
+|end_example|
+
+|pause|
+|example<| |scriptsize| ``gc2.py`` |end_scriptsize| |>|
+
+.. sourcecode:: python
+
+   def foo():
+       with file('/tmp/bar.txt', 'w') as f:
+           f.write('hello world')
+
+|end_example|
+|end_scriptsize|
+
+
+Refcounting vs generational GC (2)
+----------------------------------
+
+* ``__del__``
+
+  - especially files or sockets
+
+  - don't leak file descriptors!
+
+* weakrefs
+
+* ``finally`` inside generators
+
+
+
+Just-in-Time Compilation
+------------------------
+
+* Tracing JIT, like TraceMonkey
+
+* Complete by construction
+
+* Supports Intel x86, amd64, and soon ARM
+
+
+Short introduction to JITting
+-----------------------------
+
+* run code with the interpreter
+
+* observe what it does
+
+* generate optimized machine code for commonly executed paths
+
+* using runtime knowledge (types, paths taken)
+
+Tracing JIT
+-----------
+
+* compiles one loop at a time
+
+* generates linear code paths, recording what the interpreter did
+
+* for each possible branch, generate a guard, that exits assembler on triggering
+
+* if guard fails often enough, start tracing from the failure
+
+Meta-Tracing in PyPy
+--------------------
+
+* The explanation above assumes a tracing JIT for the full Python
+  language
+
+* Would need to be maintained whenever we change the Python version we
+  support
+
+* Instead, we have a "meta-tracing JIT"
+
+* A very important point for us since we don't have a huge team
+  to implement all Python semantics for the JIT
+
+* We trace the python interpreter's main loop (running N times) interpreting
+  a python loop (running once)
+
+
+PYPYLOG
+--------
+
+|small|
+
+* ``PYPYLOG=categories:logfile pypy program.py``
+
+|end_small|
+
+* categories:
+
+  - gc-minor, gc-major
+
+  - jit-log-noopt, jit-log-opt
+
+  - jit-backend
+
+  - jit-backend-counts
+
+
+Inspecting the JIT log
+-----------------------
+
+|scriptsize|
+|example<| |scriptsize| ``count.py`` |end_scriptsize| |>|
+
+.. sourcecode:: python
+
+    def count_mult_of_5(N):
+        mult = 0
+        not_mult = 0
+        for i in range(N):
+            if i % 5 == 0:
+                mult += 1
+            else:
+                not_mult += 1
+        return mult, not_mult
+
+|end_example|
+|end_scriptsize|
+
+|small|
+
+* ``PYPYLOG=jit-log-opt:mylog pypy count.py 2000``
+
+* ``PYPYLOG=jit-log-opt:mylog pypy count.py 10000``
+
+|end_small|
+
+
+The jitviewer
+-------------
+
+|scriptsize|
+
+* ``PYPYLOG=jit-log-opt,jit-backend-counts:mylog pypy count.py 2000``
+
+* ``PYPYLOG=jit-log-opt,jit-backend-counts:mylog pypy count.py 10000``
+
+* ``jitviewer.py log.pypylog``
+
+* Look at the (missing) bridge!
+
+|end_scriptsize|
diff --git a/talk/rst2beamer-template/talk.txt b/talk/ep2011/training/teaser.rst
copy from talk/rst2beamer-template/talk.txt
copy to talk/ep2011/training/teaser.rst
--- a/talk/rst2beamer-template/talk.txt
+++ b/talk/ep2011/training/teaser.rst
@@ -1,7 +1,188 @@
 .. include:: beamerdefs.txt
 
 ================================
-Title
+PyPy training session
 ================================
 
-XXX
+What is PyPy?
+-------------------------
+
+* PyPy
+
+  - started in 2003
+
+  - Open Source, partially funded by EU and others
+
+  - framework for fast dynamic languages
+
+  - Python implementation
+
+
+Speed
+------
+
+.. image:: ../talk/pypy-vs-cpython.png
+   :scale: 40%
+   :align: center
+
+
+
+PyPy training session
+---------------------
+
+- Part 1: Run your application under PyPy
+
+- Part 2: Write your own interpreter with PyPy
+
+
+How to run PyPy
+----------------
+
+* ``pypy program.py``
+
+* That's it!
+
+  - (modulo details)
+
+Challenge
+---------
+
+* ``html_fibo.py``
+
+* HTML list of fibonacci numbers
+
+* (the most complicate ever)
+
+* run it on CPython
+
+* run it on PyPy
+
+* fix it!
+
+
+
+
+Just-in-Time Compilation
+------------------------
+
+* Tracing JIT, like TraceMonkey
+
+* Complete by construction
+
+* Supports Intel x86, amd64, and soon ARM
+
+
+Short introduction to JITting
+-----------------------------
+
+* run code with the interpreter
+
+* observe what it does
+
+* generate optimized machine code for commonly executed paths
+
+* using runtime knowledge (types, paths taken)
+
+Tracing JIT
+-----------
+
+* compiles one loop at a time
+
+* generates linear code paths, recording what the interpreter did
+
+* for each possible branch, generate a guard, that exits assembler on triggering
+
+* if guard fails often enough, start tracing from the failure
+
+Meta-Tracing in PyPy
+--------------------
+
+* The explanation above assumes a tracing JIT for the full Python
+  language
+
+* Would need to be maintained whenever we change the Python version we
+  support
+
+* Instead, we have a "meta-tracing JIT"
+
+* A very important point for us since we don't have a huge team
+  to implement all Python semantics for the JIT
+
+* We trace the python interpreter's main loop (running N times) interpreting
+  a python loop (running once)
+
+
+PYPYLOG
+--------
+
+|small|
+
+* ``PYPYLOG=categories:logfile pypy program.py``
+
+|end_small|
+
+* categories:
+
+  - gc-minor, gc-major
+
+  - jit-log-noopt, jit-log-opt
+
+  - jit-backend
+
+  - jit-backend-counts
+
+
+Inspecting the JIT log
+-----------------------
+
+|scriptsize|
+|example<| |scriptsize| ``count.py`` |end_scriptsize| |>|
+
+.. sourcecode:: python
+
+    def count_mult_of_5(N):
+        mult = 0
+        not_mult = 0
+        for i in range(N):
+            if i % 5 == 0:
+                mult += 1
+            else:
+                not_mult += 1
+        return mult, not_mult
+
+|end_example|
+|end_scriptsize|
+
+|small|
+
+* ``PYPYLOG=jit-log-opt:mylog pypy count.py 2000``
+
+* ``PYPYLOG=jit-log-opt:mylog pypy count.py 10000``
+
+|end_small|
+
+
+The jitviewer
+-------------
+
+|scriptsize|
+
+* ``PYPYLOG=jit-log-opt,jit-backend-counts:mylog pypy count.py 2000``
+
+* ``PYPYLOG=jit-log-opt,jit-backend-counts:mylog pypy count.py 10000``
+
+* ``jitviewer.py log.pypylog``
+
+* Look at the (missing) bridge!
+
+|end_scriptsize|
+
+
+Preparation
+------------
+
+  * Bring your laptop!
+
+  * With PyPy already installed :-)
+
+  * http://ep2011.europython.eu/conference/talks/pypy-hands-on
diff --git a/talk/rst2beamer-template/title.latex b/talk/ep2011/training/title.latex
copy from talk/rst2beamer-template/title.latex
copy to talk/ep2011/training/title.latex
--- a/talk/rst2beamer-template/title.latex
+++ b/talk/ep2011/training/title.latex
@@ -1,5 +1,5 @@
 \begin{titlepage}
 \begin{figure}[h]
-\includegraphics[width=80px]{../img/py-web.png}
+\includegraphics[width=60px]{../../img/py-web-new.png}
 \end{figure}
 \end{titlepage}
diff --git a/talk/icooolps2011/jit-hints.pdf b/talk/icooolps2011/jit-hints.pdf
index 8f565e168273b6727e94e7d51edd71a0674852a7..c78b3b84550a3db53382fb1fb1a9a97c0596a4ef
GIT binary patch

[cut]

diff --git a/talk/icooolps2011/paper.tex b/talk/icooolps2011/paper.tex
--- a/talk/icooolps2011/paper.tex
+++ b/talk/icooolps2011/paper.tex
@@ -1,4 +1,4 @@
-\documentclass[preprint]{sigplanconf}
+\documentclass{sigplanconf}
 
 \usepackage{ifthen}
 \usepackage{fancyvrb}
@@ -93,9 +93,9 @@
            {cfbolz at gmx.de \and anto.cuni at gmail.com \and fijal at merlinux.eu \and
            leuschel at cs.uni-duesseldorf.de \and samuele.pedroni at gmail.com \and arigo at tunes.org}
 
-\conferenceinfo{ICOOOLPS}{'11 Lancaster, UK}
+\conferenceinfo{ICOOOLPS'11,}{July 26, 2011, Lancaster, UK.}
 \CopyrightYear{2011}
-\crdata{XXX}
+\crdata{978-1-4503-0894-6/11/07}
 
 \maketitle
 
@@ -115,8 +115,7 @@
 feedback. This restricted their performance. In this paper we describe the
 mechanisms in PyPy's meta-tracing JIT that can be used to control
 runtime feedback in language-specific ways. These mechanisms are flexible
-enough to express classical VM techniques such as maps and polymorphic inline
-caches.
+enough to express classical VM techniques such as maps and runtime type feedback.
 
 \end{abstract}
 
@@ -124,10 +123,10 @@
 %___________________________________________________________________________
 \section{Introduction}
 
-One of the hardest parts of implementing a dynamic language efficiently is to
-optimize its object model. This is made harder by the fact that many recent
-languages such as Python, JavaScript or Ruby have a rather complex core object
-semantics. For them, even implementing just an interpreter is already a complex
+One of the hardest parts of implementing an object-oriented dynamic language well is to
+optimize its object model. This is made harder by the complexity of the core
+object semantics of many recent languages such as Python, JavaScript or Ruby.
+For them, even implementing just an interpreter is already a difficult
 task. Implementing these languages efficiently with a just-in-time compiler (JIT) is
 extremely challenging, because of their many corner-cases.
 
@@ -169,8 +168,8 @@
 meta-tracing context.
 
 Together these hints can be used to express many classic implementation
-techniques used for object models of dynamic languages, such as maps and
-polymorphic inline caches.
+techniques used for object models of dynamic languages, such runtime type
+feedback and maps.
 
 The contributions of this paper are:
 \begin{itemize}
@@ -226,7 +225,7 @@
 \label{sub:tracing}
 
 A recently popular approach to JIT compilers is that of tracing JITs. Tracing
-JITs have their origin in the Dynamo project, which used the technique for dynamic
+JITs were popularized by the Dynamo project, which used the technique for dynamic
 machine code optimization \cite{bala_dynamo:_2000}. Later they were used to implement
 a lightweight JIT for Java \cite{gal_hotpathvm:_2006} and for dynamic languages such as
 JavaScript \cite{gal_trace-based_2009}.
@@ -257,7 +256,7 @@
 Therefore PyPy's JIT is a \emph{meta-tracer} \cite{bolz_tracing_2009}. It does not
 trace the execution of the user program, but instead traces the execution of
 the \emph{interpreter} that is running the program. This means that the traces
-it produces don't contain the bytecodes of the language in question, but
+it produces do not contain the bytecodes of the language in question, but
 RPython-level operations that the interpreter did to execute the program.
 
 Tracing through the execution of an interpreter has many advantages. It makes
@@ -312,7 +311,7 @@
 object model that just supports classes and instances, without any
 inheritance or other advanced features. In the model classes contain methods.
 Instances have a class. Instances have their own attributes (or fields). When looking up an
-attribute on an instance, the instance's attributes are searched. If the
+attribute of an instance, the instance's attributes are searched. If the
 attribute is not found there, the class' methods are searched.
 
 \begin{figure}
@@ -335,7 +334,7 @@
 When using this object model in
 an interpreter, a large amount of time will be spent doing lookups in these
 dictionaries.
-Let's assume we trace through code that sums three attributes, such as:
+Let us assume we trace through code that sums three attributes, such as:
 \anto{I still think it's a bit weird to call them ``methods'' and then use
   them as attributes in the example}
 
@@ -362,7 +361,7 @@
 condition in the original code. The trace contains
 five calls to \texttt{dict.get}, which is slow. To make the language efficient
 using a tracing JIT, we need to find a way to get rid of these dictionary
-lookups somehow. How to achieve this will be topic of
+lookups. How to achieve this will be the topic of
 Section~\ref{sec:fastobjmodel}.
 
 
@@ -378,10 +377,11 @@
 
 In this section we will describe two hints that allow the
 interpreter author to increase the optimization opportunities for constant
-folding. If applied correctly these techniques can give really big speedups by
+folding.
+If applied correctly these techniques can give really big speedups by
 pre-computing parts of what happens at runtime. On the other
 hand, if applied incorrectly they might lead to code bloat, thus making the
-resulting program actually slower.
+resulting program actually slower. Note that these hints are \emph{never} put into the user program, only into the interpreter.
 
 For constant folding to work, two conditions need to be met: the arguments of
 an operation actually need to all be constant, i.e. statically known by the
@@ -435,13 +435,12 @@
 the static setting of classic partial evaluation.
 
 Promotion is essentially a tool for trace specialization. There are places in
-the interpreter where knowing that a value is constant opens a lot of
-optimization opportunities, even though it
-could have different values in practice. In such a place, promotion can be used. The
-typical reason to do that is if there is
-a lot of computation depending on the value of one variable.
+the interpreter where it would open a lot of optimization opportunities if a
+variable were constant, even though it could have different values in
+practice. In such a place, promotion can be used. The typical reason to do that
+is if there is a lot of computation depending on the value of one variable.
 
-Let's make this more concrete. If we trace a call to the function (written in
+Let us make this more concrete. If we trace a call to the function (written in
 RPython) on the left, we get the trace on the right:
 
 \begin{minipage}[b]{0.5\linewidth}
@@ -468,7 +467,7 @@
 \end{minipage}
 
 Observe how the first two operations could be constant-folded if the value of
-$x_1$ were known. Let's assume that the value of \texttt{x} in the RPython code can vary, but does so
+$x_1$ were known. Let us assume that the value of \texttt{x} in the RPython code can vary, but does so
 rarely, i.e. only takes a few different values at runtime. If this is the
 case, we can add a hint to promote \texttt{x}, like this:
 
@@ -500,11 +499,10 @@
 
 The hint indicates that \texttt{x} is likely a runtime constant and the JIT
 should try to perform runtime specialization on it
-in the code that follows.\footnote{For technical reasons the promote hint needs
-to be written down slightly differently in the actual code.}  When just running
+in the code that follows. When just running
 the code, the \texttt{promote} function has no
 effect. When tracing, some extra work
-is done. Let's assume that this changed function is traced with
+is done. Let us assume that this changed function is traced with
 the arguments \texttt{4} and \texttt{8}. The trace will be the same, except for one
 operation at the beginning.
 
@@ -513,10 +511,9 @@
 then be exploited by the compiler. The introduced
 guard specializes the trace, because it only works if the value of $x_1$ is
 \texttt{4}. From the point of view of the
-optimizer, this guard is not any different than the one produced by the \texttt{if}
-statement in the first example. After the guard, the rest of the trace can
-assume that $x_1$ is equal to \texttt{4}, meaning that the optimizer will turn this
-trace into:
+optimizer, this guard is not different frome the one produced by the \texttt{if}
+statement in the first example. After the guard, it can be assumed that $x_1$
+is equal to \texttt{4}, meaning that the optimizer will turn this trace into:
 
 {\noop
 \begin{lstlisting}[mathescape,basicstyle=\ttfamily]
@@ -547,8 +544,8 @@
 This new trace will be attached to the guard instruction of the first trace. If
 $x_1$ takes on even more values, a new trace will eventually be made for all of them,
 linking them into a chain. This is clearly not desirable, so we should promote
-only variables that don't vary much. However, adding a promotion hint will never produce wrong
-results. It might just lead to too much assembler code being generated.
+only variables that do not vary much. However, adding a promotion hint will never produce wrong
+results. It might just lead to too much machine code being generated.
 
 Promoting integers, as in the examples above, is not used that often.
 However, the internals of dynamic language interpreters often
@@ -580,7 +577,7 @@
 idempotent side effects\footnote{This property
 is less strict than that of a pure function, because it is only about actual
 calls during execution. All pure functions are trace-elidable though.}.
-From this definition follows that a call to an trace-elidable function with
+From this definition follows that a call to a trace-elidable function with
 constant arguments in a trace can be replaced with the result of the call seen during tracing.
 
 As an example, take the class on the left. Tracing the call \texttt{a.f(10)} of
@@ -621,7 +618,7 @@
 which lets the interpreter author communicate invariants to the optimizer. In
 this case, she could decide that the \texttt{x} field of instances of \texttt{A} is
 immutable, and therefore \texttt{c}
-is an trace-elidable function. To communicate this, there is an \texttt{@elidable} decorator.
+is a trace-elidable function. To communicate this, there is an \texttt{@elidable} decorator.
 If the code in \texttt{c} should be constant-folded away, we would change the
 class as follows:
 
@@ -698,7 +695,7 @@
 
 The first step in making \texttt{getattr} faster in our object model is to optimize
 away the dictionary lookups on the instances. The hints of the previous section
-don't seem to help with the current object model. There is
+do not seem to help with the current object model. There is
 no trace-elidable function to be seen, and the instance is not a candidate for promotion,
 because there tend to be many instances.
 
@@ -726,7 +723,7 @@
 reference to a map, which maps field names to indexes into a storage list. The
 storage list contains the actual field values. Maps are shared between
 different instances, therefore they have to be immutable, which means
-that their \texttt{getindex} method is an trace-elidable function. When a new attribute is added
+that their \texttt{getindex} method is a trace-elidable function. When a new attribute is added
 to an instance, a new map needs to be chosen, which is done with the
 \texttt{add\_attribute} method on the previous map. This function is also trace-elidable,
 because it caches all new instances of \texttt{Map} that it creates, to make
@@ -735,7 +732,7 @@
 introduced maps, it is safe to promote the map everywhere, because we assume
 that the number of different instance layouts is small.
 
-With this adapted instance implementation, the trace we saw in Section~\ref{sub:running} changes to the
+With this adapted instance implementation, the trace we saw in Section~\ref{sub:running} changes to
 that of Figure~\ref{fig:trace2}. There \texttt{0xb74af4a8} is the
 memory address of the \texttt{Map} instance that has been promoted. Operations
 that can be optimized away are grayed out, their results will be replaced with
@@ -776,7 +773,7 @@
 enough.\footnote{There is a more complex variant of the presented technique that can
 accommodate quick-changing class fields a lot better.}
 
-What we would really like is if the \texttt{Class.find\_method} method were trace-elidable.
+What we would really like that the \texttt{Class.find\_method} method is trace-elidable.
 But it cannot be, because it is always possible to change the class itself.
 Every time the class changes, \texttt{find\_method} can potentially return a
 new value.
@@ -798,7 +795,7 @@
 What is interesting here is that \texttt{\_find\_method} takes the \texttt{version}
 argument but it does not use it at all. Its only purpose is to make the call
 trace-elidable, because when the version object changes, the result of the call might be
-different than the previous one.
+different from the previous one.
 
 \begin{figure}
 \input{code/trace4.tex}
@@ -956,7 +953,7 @@
 Lua VM in C, which makes it hard to judge the effectiveness of the approach.
 
 SPUR \cite{bebenita_spur:_2010} is a tracing JIT for CIL bytecode, which is then
-used to trace through an JavaScript implementation written in C\#. The
+used to trace through a JavaScript implementation written in C\#. The
 JavaScript implementation compiles JavaScript to CIL bytecode together with an
 implementation of the JavaScript object model. The object model uses maps
 and inline caches to speed up operations on objects. The tracer traces through
@@ -983,20 +980,22 @@
 
 Somewhat relatedly, the proposed ``invokedynamic'' bytecode
 \cite{rose_bytecodes_2009} that will be added to the JVM is supposed to make the
-implementation of dynamic languages on top of JVMs easier. The bytecode gives the user access to generalized inline caches. It requires of course compilation to JVM bytecode instead of simply writing an interpreter, predictability of performance across JVMs is also an open question.
+implementation of dynamic languages on top of JVMs easier. The bytecode gives
+the user access to generalized inline caches. It requires of course compilation
+to JVM bytecode instead of writing an interpreter.
 
-We already explored promotion in other context, such as earlier versions of
+We already explored promotion in other contexts, such as earlier versions of
 PyPy's JIT.
 %as well as a Prolog partial evaluator \cite{bolz_towards_2009}
 Promotion is also heavily
 used by Psyco \cite{rigo_representation-based_2004} (promotion is called
 "unlifting" in this paper) a method-based JIT compiler for Python written by
 one of the authors. Promotion is quite similar to
-(polymorphic) inline caching and runtime type feedback techniques which were
+runtime type feedback (and also inline caching) techniques which were
 first used in Smalltalk \cite{deutsch_efficient_1984} and SELF
-\cite{hoelzle_optimizing_1991,hoelzle_optimizing_1994} implementations.
-Promotion is more general because any information can be cached in line, not
-just classes of method receivers.
+\cite{hoelzle_optimizing_1994} implementations.
+Promotion is more general because any information can be fed back into
+compilation, not just types.
 
 %is there anything about versions? smalltalks tend to clear their method caches
 %when new methods are added. self and java use dependency tracking and
diff --git a/talk/img/py-web-new.png b/talk/img/py-web-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a90eae9aabc7a7dcf5b6327657ba2d057bedc02
GIT binary patch

[cut]

diff --git a/talk/iwtc11/Makefile b/talk/iwtc11/Makefile
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/Makefile
@@ -0,0 +1,27 @@
+# for tikz2pdf: http://codespeak.net/svn/user/antocuni/bin/tikz2pdf
+
+licm.pdf: paper.tex paper.bib 
+	pdflatex paper
+	-bibtex paper
+	pdflatex paper
+	pdflatex paper
+	mv paper.pdf licm.pdf
+
+view: licm.pdf
+	evince licm.pdf &
+
+xpdf: licm.pdf
+	xpdf licm.pdf &
+
+
+%.png: %.dot
+	dot -Tpng  $< > $@
+
+%.eps: %.dot
+	dot -Tps  $< > $@
+
+%.pdf: %.eps
+	epstopdf $<
+
+%.pdf: %.tikz
+	tikz2pdf -s $<
diff --git a/talk/iwtc11/benchmarks/benchmark.sh b/talk/iwtc11/benchmarks/benchmark.sh
new file mode 100755
--- /dev/null
+++ b/talk/iwtc11/benchmarks/benchmark.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+echo
+echo $*
+if [ "$1" == "gcc" ]; then
+    ./runner.py -n 5 -c "$*" sqrt/sqrt_double.c
+    ./runner.py -n 5 -c "$*" sqrt/sqrt_long.c
+    ./runner.py -n 5 -c "$*" sqrt/sqrt_fix16.c
+    #./runner.py -n 5 -c "$* -lm" convolution/conv3.c 1
+    #./runner.py -n 5 -c "$* -lm" convolution/conv5.c 1
+    ./runner.py -n 5 -c "$* -lm" convolution/conv3.c 100
+    ./runner.py -n 5 -c "$* -lm" convolution/conv5.c 100
+    ./runner.py -n 5 -c "$* -lm" convolution/conv3.c 1000
+    ./runner.py -n 5 -c "$* -lm" convolution/conv5.c 1000
+    ./runner.py -n 5 -c "$* -lstdc++" convolution/conv3x3.cc 1000000 3
+    ./runner.py -n 5 -c "$* -lstdc++" convolution/conv3x3.cc 1000 1000
+    ./runner.py -n 5 -c "$* -lstdc++" convolution/dilate3x3.cc 1000 1000
+    ./runner.py -n 5 -c "$* -lstdc++" image/sobel.cc 1000 1000
+    rm a.out
+else
+    if [ "$1" == "python2.7" ]; then
+        EXTRA_OPTS='-w 0 -n 1'
+    fi
+    if [ "$1" == "python2.6" ]; then
+        EXTRA_OPTS='-w 1 -n 1'
+    fi
+    #$* ./runner.py $EXTRA_OPTS sqrt/sqrt.py main int
+    #$* ./runner.py $EXTRA_OPTS sqrt/sqrt.py main float
+    #$* ./runner.py $EXTRA_OPTS sqrt/sqrt.py main Fix16
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 1
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 1
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 100
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 100
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 1000
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 1000
+    $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3 1000000 3
+    $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3 1000 1000
+    $* ./runner.py $EXTRA_OPTS convolution/convolution.py dilate3x3 1000 1000
+    #$* ./runner.py $EXTRA_OPTS convolution/convolution.py sobel_magnitude 1000 1000
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded iter
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded range
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImage
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImage iter
+    #$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImage range
+    #$* ./runner.py $EXTRA_OPTS image/sobel.py main NoBorderImagePadded
+    #$* ./runner.py $EXTRA_OPTS image/sobel.py main NoBorderImagePadded uint8
+fi
diff --git a/talk/iwtc11/benchmarks/convolution/conv3.c b/talk/iwtc11/benchmarks/convolution/conv3.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/conv3.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+
+#define N 100000000
+double *a, *b;
+
+void conv(double *a, double *k, double *b, int n) {
+//void conv(double *__restrict__ a, double *__restrict__ k, double *__restrict__ b, int n) {
+  int i;
+  for (i=0; i<n-2; i++) {
+    b[i] = k[2]*a[i] + k[1]*a[i+1] + k[0]*a[i+2];
+  }
+}
+
+int main(int ac, char **av) {
+  double k[3] = {-1, 0, 1};
+  a = malloc(N*sizeof(double));
+  b = malloc(N*sizeof(double));
+  int i;
+  for (i=0; i<N; i++) a[i] = 1;
+  int n = atoi(av[1]);
+  for (i=0; i<n; i++)
+    conv(a,k, b, N/n);
+  printf("%f\n", b[N/2]);
+  fprintf(stderr, "conv3(1e%d):     ", ((int) log10(N/n)));
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/convolution/conv3x3.cc b/talk/iwtc11/benchmarks/convolution/conv3x3.cc
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/conv3x3.cc
@@ -0,0 +1,46 @@
+// A safe array example.
+#include <stdio.h>
+#include <stdlib.h>
+
+class Array2D {
+  double *data;
+public:
+  int width, height;
+  Array2D(int w, int h) {
+    width = w;
+    height = h;
+    data = (double *) malloc(w*h*sizeof(double));
+  }
+  double &operator()(int x, int y) {
+    if (x >= 0 && x < width && y >= 0 && y < height) {
+	return data[y*width + x];
+    }
+    printf("IndexError\n");
+    exit(1);
+  }
+};
+
+void conv3x3(Array2D &a, Array2D &k, Array2D &b) {
+  int x, y;
+  for (y=1; y<a.height-1; y++) {
+    for (x=1; x<a.width-1; x++) {
+      b(x, y) = k(2,2)*a(x-1, y-1) + k(1,2)*a(x, y-1) + k(0,2)*a(x+1, y-1) +
+	        k(2,1)*a(x-1, y)   + k(1,1)*a(x, y)   + k(0,1)*a(x+1, y)   + 
+	        k(2,0)*a(x-1, y+1) + k(1,0)*a(x, y+1) + k(0,0)*a(x+1, y+1);
+
+    }
+  }
+}
+
+int main(int ac, char **av) {
+  int w = atoi(av[1]), h = atoi(av[2]);
+  int i;
+
+  for (i=0; i<10; i++) {
+    Array2D a(w, h), b(w, h), k(3, 3);
+    conv3x3(a, k, b);
+    printf("%f\n", b(1,1));
+  }
+  fprintf(stderr, "conv3x3(%d):  ", h);
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/convolution/conv5.c b/talk/iwtc11/benchmarks/convolution/conv5.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/conv5.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+
+#define N 100000000
+double *a, *b;
+
+void conv(double *a, double *k, double *b, int n) {
+//void conv(double *__restrict__ a, double *__restrict__ k, double *__restrict__ b, int n) {
+  int i;
+  for (i=0; i<n-4; i++) {
+    b[i] = k[4]*a[i] + k[3]*a[i+1] + k[2]*a[i+2] + k[1]*a[i+3] + k[0]*a[i+4];
+  }
+}
+
+int main(int ac, char **av) {
+    double k[5] = {1, 4, 6, 4, 1};
+    a = malloc(N*sizeof(double));
+    b = malloc(N*sizeof(double));
+    int i;
+    for (i=0; i<N; i++) a[i] = 1;
+    int n = atoi(av[1]);
+    for (i=0; i<n; i++)
+      conv(a,k, b, N/n);
+    printf("%f\n", b[N/2]);
+    fprintf(stderr, "conv5(1e%d):     ", ((int) log10(N/n)));
+    return 0;
+}
diff --git a/talk/iwtc11/benchmarks/convolution/convolution.py b/talk/iwtc11/benchmarks/convolution/convolution.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/convolution.py
@@ -0,0 +1,113 @@
+from array import array
+from math import log10, sqrt
+
+def _conv3(a, k, n=1):
+    assert len(k)==3
+    b = array(a.typecode, [0]) * (len(a) - 2)
+    while n:
+        n -= 1
+        for i in xrange(len(b)):
+            b[i] = k[2]*a[i] + k[1]*a[i+1] + k[0]*a[i+2]
+    return b
+
+def conv3(args):
+    n = int(args[0])
+    _conv3(array('d', [1]) * (100000000/n),
+           array('d', [-1, 0, 1]), n)
+    return 'conv3(array(1e%d))' % log10(100000000/n)
+
+def _conv5(a, k, n=1):
+    assert len(k)==5
+    b = array(a.typecode, [0]) * (len(a) - 4)
+    while n:
+        n -= 1
+        for i in xrange(len(b)):
+            b[i] = k[4]*a[i] + k[3]*a[i+1] + k[2]*a[i+2] + k[1]*a[i+3] + k[0]*a[i+4]
+    return b
+
+def conv5(args):
+    n = int(args[0])
+    _conv5(array('d', [1]) * (100000000/n),
+           array('d', [1, 4, 6, 4, 1]), n)
+    return 'conv5(array(1e%d))' % log10(100000000/n)
+
+class Array2D(object):
+    def __init__(self, w, h):
+        self.width = w
+        self.height = h
+        self.data = array('d', [0]) * (w*h)
+
+    def _idx(self, x, y):
+        if 0 <= x < self.width and 0 <= y < self.height:
+            return y*self.width + x
+        raise IndexError
+
+    def __getitem__(self, (x, y)):
+        return self.data[self._idx(x, y)]
+
+    def __setitem__(self, (x, y), val):
+        self.data[self._idx(x, y)] = val
+
+    def __cmp__(self, other):
+        return cmp(self.data, other.data)
+
+    def setup(self, data):
+        for y in xrange(self.height):
+            for x in xrange(self.width):
+                self[x, y] = data[y][x]
+        return self
+
+def _conv3x3(a, b, k):
+    assert k.width == k.height == 3
+    for y in xrange(1, a.height-1):
+        for x in xrange(1, a.width-1):
+            b[x, y] = k[2,2]*a[x-1, y-1] + k[1,2]*a[x, y-1] + k[0,2]*a[x+1, y-1] + \
+                      k[2,1]*a[x-1, y]   + k[1,1]*a[x, y]   + k[0,1]*a[x+1, y]   + \
+                      k[2,0]*a[x-1, y+1] + k[1,0]*a[x, y+1] + k[0,0]*a[x+1, y+1]
+    return b
+
+def morphology3x3(a, b, k, func):
+    assert k.width == k.height == 3
+    for y in xrange(1, a.height-1):
+        for x in xrange(1, a.width-1):
+            b[x, y] = func(k[2,2]*a[x-1, y-1], k[1,2]*a[x, y-1], k[0,2]*a[x+1, y-1], \
+                           k[2,1]*a[x-1, y]  , k[1,1]*a[x, y]  , k[0,1]*a[x+1, y]  , \
+                           k[2,0]*a[x-1, y+1], k[1,0]*a[x, y+1], k[0,0]*a[x+1, y+1])
+    return b
+
+def _dilate3x3(a, b, k):
+    return morphology3x3(a, b, k, max)
+
+def _erode3x3(a, k):
+    return morphology3x3(a, k, min)
+
+def conv3x3(args):
+    a = Array2D(int(args[0]), int(args[1]))
+    b = Array2D(a.width, a.height)
+    for i in range(10):
+        _conv3x3(a, b, Array2D(3,3))
+    return 'conv3x3(Array2D(%sx%s))' % tuple(args)
+
+def dilate3x3(args):
+    a = Array2D(int(args[0]), int(args[1]))
+    b = Array2D(a.width, a.height)
+    for i in range(10):
+        _dilate3x3(a, b, Array2D(3,3))
+    return 'dilate3x3(Array2D(%sx%s))' % tuple(args)
+
+def _sobel_magnitude(a):
+    b = Array2D(a.width, a.height)    
+    for y in xrange(1, a.height-1):
+        for x in xrange(1, a.width-1):
+            dx = -1.0 * a[x-1, y-1] + 1.0 * a[x+1, y-1] + \
+                 -2.0 * a[x-1, y]   + 2.0 * a[x+1, y] + \
+                 -1.0 * a[x-1, y+1] + 1.0 * a[x+1, y+1]
+            dy = -1.0 * a[x-1, y-1] -2.0 * a[x, y-1] -1.0 * a[x+1, y-1] + \
+                  1.0 * a[x-1, y+1] +2.0 * a[x, y+1] +1.0 * a[x+1, y+1]
+            b[x, y] = sqrt(dx*dx + dy*dy) / 4.0
+    return b
+
+def sobel_magnitude(args):
+    for i in range(10):
+        _sobel_magnitude(Array2D(int(args[0]), int(args[1])))
+    return 'sobel(Array2D(%sx%s))' % tuple(args)
diff --git a/talk/iwtc11/benchmarks/convolution/dilate3x3.cc b/talk/iwtc11/benchmarks/convolution/dilate3x3.cc
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/dilate3x3.cc
@@ -0,0 +1,54 @@
+// A safe array example.
+#include <stdio.h>
+#include <stdlib.h>
+
+class Array2D {
+  double *data;
+public:
+  int width, height;
+  Array2D(int w, int h) {
+    width = w;
+    height = h;
+    data = (double *) malloc(w*h*sizeof(double));
+  }
+  double &operator()(int x, int y) {
+    if (x >= 0 && x < width && y >= 0 && y < height) {
+	return data[y*width + x];
+    }
+    printf("IndexError\n");
+    exit(1);
+  }
+};
+
+#define max(x,y) ((x) > (y) ? (x) : (y))
+
+void dilate3x3(Array2D &a, Array2D &k, Array2D &b) {
+  int x, y;
+  for (y=1; y<a.height-1; y++) {
+    for (x=1; x<a.width-1; x++) {
+      double v = k(2,2)*a(x-1, y-1);
+      v = max(v, k(1,2)*a(x, y-1));
+      v = max(v, k(0,2)*a(x+1, y-1));
+      v = max(v, k(2,1)*a(x-1, y));
+      v = max(v, k(1,1)*a(x, y));
+      v = max(v, k(0,1)*a(x+1, y));
+      v = max(v, k(2,0)*a(x-1, y+1));
+      v = max(v, k(1,0)*a(x, y+1));
+      v = max(v, k(0,0)*a(x+1, y+1));
+      b(x, y) = v;
+    }
+  }
+}
+
+int main(int ac, char **av) {
+  int w = atoi(av[1]), h = atoi(av[2]);
+  int i;
+
+  for (i=0; i<10; i++) {
+    Array2D a(w, h), b(w, h), k(3, 3);
+    dilate3x3(a, k, b);
+    printf("%f\n", b(1,1));
+  }
+  fprintf(stderr, "dilate3x3(%d):  ", h);
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/convolution/test_convolution.py b/talk/iwtc11/benchmarks/convolution/test_convolution.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/test_convolution.py
@@ -0,0 +1,33 @@
+from convolution import _conv3, _conv5, _conv3x3, Array2D
+from array import array
+
+def test_conv3():
+    b = _conv3(array('d', [1, 2, 3, 4, 5, 6, 7, 8, 9]),
+               array('d', [-1, 0, 1]))
+    assert b == array('d', [-2]) * 7
+    
+def test_conv5():
+    b = _conv5(array('d', [1, 2, 3, 4, 5, 6, 7, 8, 9]),
+               array('d', [1, 1, 2, 2, 3]))
+    assert b == array('d', [22, 31, 40, 49, 58])
+    
+def test_conv3x3():
+    a = Array2D(5, 5).setup([[11, 12, 13, 14, 15],
+                              [21, 22, 23, 24, 25],
+                              [31, 32, 33, 34, 35],
+                              [41, 42, 43, 44, 45],
+                              [51, 52, 53, 54, 55]])
+    k = Array2D(3, 3).setup([[1, 2, 3],
+                              [1, 1, 2],
+                              [2, 1, 1]])
+    b = _conv3x3(a, k)
+    assert b == Array2D(5, 5).setup([[0,   0,   0,   0, 0],
+                                     [0, 326, 340, 354, 0],
+                                     [0, 466, 480, 494, 0],
+                                     [0, 606, 620, 634, 0],
+                                     [0,   0,   0,   0, 0]])
+
+if __name__ == '__main__':
+    test_conv3()
+    test_conv5()
+    test_conv3x3()
diff --git a/talk/iwtc11/benchmarks/convolution/time_conv.py b/talk/iwtc11/benchmarks/convolution/time_conv.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/time_conv.py
@@ -0,0 +1,19 @@
+from convolution import conv3, conv5
+from array import array
+import sys, time
+from math import log10
+
+n = int(sys.argv[1])
+
+a = time.time()
+conv3(array('d', [1]) * (100000000/n),
+      array('d', [-1, 0, 1]), n)
+b = time.time()
+print 'conv3(1e%d):   ' % log10(100000000/n), b - a
+
+a = time.time()
+conv5(array('d', [1]) * (100000000/n),
+      array('d', [1, 4, 6, 4, 1]), n)
+b = time.time()
+print 'conv5(1e%d):   ' % log10(100000000/n), b - a
+
diff --git a/talk/iwtc11/benchmarks/convolution/time_conv2d.py b/talk/iwtc11/benchmarks/convolution/time_conv2d.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/time_conv2d.py
@@ -0,0 +1,31 @@
+from convolution import _conv3x3, Array2D, _dilate3x3, _erode3x3
+from array import array
+import sys, time
+
+try:
+    import pypyjit
+    pypyjit.set_param(trace_limit=200000)
+except ImportError:
+    pass
+
+# Warmup
+_conv3x3(Array2D(1010, 1010), Array2D(3,3)) 
+_dilate3x3(Array2D(1010, 1010), Array2D(3,3))
+
+a = time.time()
+for i in range(10):
+    _conv3x3(Array2D(1000000, 3), Array2D(3,3))
+b = time.time()
+print 'conv3x3(3):   ', b - a
+
+a = time.time()
+for i in range(10):
+    _conv3x3(Array2D(1000, 1000), Array2D(3,3))
+b = time.time()
+print 'conv3x3(1000):', b - a
+
+a = time.time()
+for i in range(10):
+    _dilate3x3(Array2D(1000, 1000), Array2D(3,3))
+b = time.time()
+print 'dilate3x3(1000):', b - a
diff --git a/talk/iwtc11/benchmarks/image/io.py b/talk/iwtc11/benchmarks/image/io.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/io.py
@@ -0,0 +1,39 @@
+import os, re, array
+
+def mplayer(Image, fn='tv://', options=''):
+    f = os.popen('mplayer -really-quiet -noframedrop ' + options + ' ' 
+                 '-vo yuv4mpeg:file=/dev/stdout 2>/dev/null </dev/null ' + fn)
+    hdr = f.readline()
+    m = re.search('W(\d+) H(\d+)', hdr)
+    w, h = int(m.group(1)), int(m.group(2))
+    while True:
+        hdr = f.readline()
+        if hdr != 'FRAME\n':
+            break
+        yield Image(w, h, typecode='B', fromfile=f)
+        f.read(w*h/2) # Color data
+
+class MplayerViewer(object):
+    def __init__(self):
+        self.width = self.height = None
+    def view(self, img):
+        assert img.typecode == 'B'
+        if not self.width:
+            self.mplayer = os.popen('mplayer -really-quiet -noframedrop - ' +
+                                    '2> /dev/null ', 'w')
+            self.mplayer.write('YUV4MPEG2 W%d H%d F100:1 Ip A1:1\n' %
+                               (img.width, img.height))
+            self.width = img.width
+            self.height = img.height
+            self.color_data = array.array('B', [127]) * (img.width * img.height / 2)
+        assert self.width == img.width
+        assert self.height == img.height
+        self.mplayer.write('FRAME\n')
+        img.tofile(self.mplayer)
+        self.color_data.tofile(self.mplayer)
+
+default_viewer = MplayerViewer()
+
+def view(img):
+    default_viewer.view(img)
+    
diff --git a/talk/iwtc11/benchmarks/image/magnify.py b/talk/iwtc11/benchmarks/image/magnify.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/magnify.py
@@ -0,0 +1,72 @@
+from plain import Image
+from math import atan2, sqrt, sin, cos, ceil, floor
+
+class NNImage(Image):
+    def __getitem__(self, (x, y)):
+        return Image.__getitem__(self, (int(x + 0.5), int(y + 0.5)))
+
+class BilinImage(Image):
+    def __getitem__(self, (x, y)):
+        if isinstance(x, float) and isinstance(y, float):
+            x0, x1 = int(floor(x)), int(ceil(x))
+            y0, y1 = int(floor(y)), int(ceil(y))
+            xoff, yoff = x-x0, y-y0
+            return (1.0-xoff)*(1.0-yoff) * self[x0, y0] + \
+                   (1.0-xoff)*(    yoff) * self[x0, y1] + \
+                   (    xoff)*(1.0-yoff) * self[x1, y0] + \
+                   (    xoff)*(    yoff) * self[x1, y1]
+        else:
+            return Image.__getitem__(self, (x, y))
+    
+
+def magnify(img):
+    out = Image(img.width, img.height, typecode='B')
+    out.data[:] = img.data
+    maxr = img.height/3
+    for y in xrange(img.height/2 - maxr, img.height/2 + maxr):
+        for x in xrange(img.width/2 - maxr, img.width/2 + maxr):
+            dx, dy = x - img.width/2, y - img.height/2
+            a = atan2(dy, dx)
+            r = sqrt(dx ** 2 + dy ** 2)
+            if r < maxr:
+                nr = r*r / maxr
+                nx, ny = nr*cos(a), nr*sin(a)
+                out[x,y] = min(int(img[nx + img.width/2, ny + img.height/2]), 255)
+            else:
+                out[x,y] = img[x,y]
+    return out
+
+if __name__ == '__main__':
+    from io import mplayer, view
+    import sys
+    from time import time
+    from optparse import OptionParser
+
+    parser = OptionParser()
+    parser.add_option('-b', dest='bilin', action="store_true",
+                      help="enable bilinear interpolation")
+    options, args = parser.parse_args()
+
+    if len(args) > 0:
+        fn = args[0]
+    else:
+        fn = 'test.avi -vf scale=640:480 -benchmark'
+    if options.bilin:
+        MyImage=BilinImage
+    else:
+        MyImage=NNImage
+
+    sys.setcheckinterval(2**30)
+    try:
+        import pypyjit
+        pypyjit.set_param(trace_limit=200000)
+    except ImportError:
+        pass
+
+    start = start0 = time()
+    for fcnt, img in enumerate(mplayer(MyImage, fn)):
+        view(magnify(img))
+        print 1.0 / (time() - start), 'fps, ', (fcnt-2) / (time() - start0), 'average fps'
+        start = time()
+        if fcnt==2:
+            start0 = time()
diff --git a/talk/iwtc11/benchmarks/image/noborder.py b/talk/iwtc11/benchmarks/image/noborder.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/noborder.py
@@ -0,0 +1,183 @@
+from array import array
+
+class NoBorderImage(object):
+    "An image class for people who dont care about border effects"
+    
+    def __init__(self, w, h, typecode='d', fromfile=None):
+        self.width = w
+        self.height = h
+        if fromfile is not None:
+            self.data = array(typecode)
+            self.data.fromfile(fromfile, w*h)
+        else:
+            self.data = array(typecode, [0]) * (w*h)
+        self.typecode = typecode
+
+    def _idx(self, p):
+        if isinstance(p, Pixel):
+            assert p.image.__class__ is self.__class__
+            assert p.image.width == self.width
+            idx = p.idx
+        else:
+            idx = p[1] * self.width + p[0]
+        return min(max(idx, 0), len(self.data)-1)
+
+    def __getitem__(self, p):
+        return self.data[self._idx(p)]
+
+    def __setitem__(self, p, val):
+        self.data[self._idx(p)] = val
+
+    def pixels(self):
+        for i in self.pixelrange():
+            yield Pixel(i, self)
+
+    def pixeliter(self):
+        return PixelIter(self)
+
+    def pixelrange(self):
+        return xrange(self.width * self.height)
+
+    def setup(self, data):
+        for y in xrange(self.height):
+            for x in xrange(self.width):
+                self[x, y] = data[y][x]
+        return self
+
+    def clone(self, **kwargs):
+        return self.__class__(self.width, self.height, **kwargs)
+
+    def tofile(self, f):
+        self.data.tofile(f)
+
+class NoBorderImagePadded(NoBorderImage):
+    def __init__(self, w, h, typecode='d', fromfile=None):
+        self.width = w
+        self.height = h
+        self.typecode = typecode
+        if fromfile is None:
+            self.data = array(typecode, [0]) * (w*(h+2)+2)
+        else:
+            self.data = array(typecode, [0]) * (w + 1)
+            self.data.fromfile(fromfile, w*h)
+            self.data += array(typecode, [0]) * (w + 1)
+
+    def _idx(self, p):
+        if isinstance(p, Pixel):
+            assert p.image.__class__ is self.__class__
+            assert p.image.width == self.width
+            idx = p.idx
+        else:
+            idx = (p[1]+1) * self.width + p[0] + 1
+        return min(max(idx, 0), len(self.data)-1)
+
+    def pixelrange(self):
+        return xrange(self.width + 1, (self.width+1) * self.height + 1)
+
+    def tofile(self, f):
+        self.data[(self.width+1):(-self.width-1)].tofile(f)
+
+
+class NoBorderImagePadded640x480(NoBorderImagePadded):
+    def _idx(self, p):
+        assert self.width == 640
+        assert self.height == 480
+        assert len(self.data) == 640*(480+2)+2
+        return NoBorderImagePadded._idx(self, p)
+    
+
+class Pixel(object):
+    def __init__(self, idx, image):
+        self.idx = idx
+        self.image = image
+
+    def __add__(self, other):
+        return Pixel(self.idx + other[1]*self.image.width + other[0], self.image)
+
+class PixelIter(object):
+    def __init__(self, image):
+        self.image = image
+        self.pixelrange = iter(image.pixelrange())
+        
+    def __iter__(self):
+        return self
+
+    def next(self):
+        return Pixel(self.pixelrange.next(), self.image)
+
+def conv3x3(img, k):
+    assert k.width == k.height == 3
+    res = img.clone()
+    for p in img.pixels():
+        res[p] = k[2,2]*img[p + (-1,-1)] + k[1,2]*img[p + (0,-1)] + k[0,2]*img[p + (1,-1)] + \
+                 k[2,1]*img[p + (-1, 0)] + k[1,1]*img[p + (0, 0)] + k[0,1]*img[p + (1, 0)] + \
+                 k[2,0]*img[p + (-1, 1)] + k[1,0]*img[p + (0, 1)] + k[0,0]*img[p + (1, 1)]
+    return res
+
+def conv3x3iter(img, k):
+    assert k.width == k.height == 3
+    res = img.clone()
+    for p in img.pixeliter():
+        res[p] = k[2,2]*img[p + (-1,-1)] + k[1,2]*img[p + (0,-1)] + k[0,2]*img[p + (1,-1)] + \
+                 k[2,1]*img[p + (-1, 0)] + k[1,1]*img[p + (0, 0)] + k[0,1]*img[p + (1, 0)] + \
+                 k[2,0]*img[p + (-1, 1)] + k[1,0]*img[p + (0, 1)] + k[0,0]*img[p + (1, 1)]
+    return res
+
+def conv3x3range(img, k):
+    assert k.width == k.height == 3
+    res = img.clone()
+    for i in img.pixelrange():
+        p = Pixel(i, img)
+        res[p] = k[2,2]*img[p + (-1,-1)] + k[1,2]*img[p + (0,-1)] + k[0,2]*img[p + (1,-1)] + \
+                 k[2,1]*img[p + (-1, 0)] + k[1,1]*img[p + (0, 0)] + k[0,1]*img[p + (1, 0)] + \
+                 k[2,0]*img[p + (-1, 1)] + k[1,0]*img[p + (0, 1)] + k[0,0]*img[p + (1, 1)]
+    return res
+
+def main(args):
+    Image = eval(args[0])
+    if len(args) == 1:
+        func = conv3x3
+    else:
+        func = eval('conv3x3' + args[1])
+    n = 1000
+    for i in range(10):
+        func(Image(n, n), Image(3, 3))
+    if len(args) > 1:
+        return 'conv3x3%s(%s(%dx%d))' % (args[1], Image.__name__, n, n)
+    else:
+        return Image.__name__
+
+if __name__ == '__main__':
+    import time, sys
+    sys.setcheckinterval(2**30)
+    try:
+        import pypyjit
+        pypyjit.set_param(trace_limit=200000)
+    except ImportError:
+        pass
+    Image = eval(sys.argv[1])
+    n = 1000
+
+    # Warmup
+    conv3x3(Image(n, n), Image(3,3))
+    conv3x3iter(Image(n, n), Image(3,3))
+    conv3x3range(Image(n, n), Image(3,3))
+
+    a = time.time()
+    for i in range(10):
+        conv3x3(Image(n, n), Image(3,3))
+    b = time.time()
+    print 'conv3x3(%s(%dx%d)):' % (Image.__name__, n, n), b - a
+
+    a = time.time()
+    for i in range(10):
+        conv3x3iter(Image(n, n), Image(3,3))
+    b = time.time()
+    print 'conv3x3iter(%s(%dx%d)):' % (Image.__name__, n, n), b - a
+
+    a = time.time()
+    for i in range(10):
+        conv3x3range(Image(n, n), Image(3,3))
+    b = time.time()
+    print 'conv3x3range(%s(%dx%d)):' % (Image.__name__, n, n), b - a
+
diff --git a/talk/iwtc11/benchmarks/image/plain.py b/talk/iwtc11/benchmarks/image/plain.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/plain.py
@@ -0,0 +1,87 @@
+from array import array
+from math import sqrt
+
+class Image(object):
+    def __init__(self, w, h, typecode='d', fromfile=None):
+        self.width = w
+        self.height = h
+        if fromfile is not None:
+            self.data = array(typecode)
+            self.data.fromfile(fromfile, w*h)
+        else:
+            self.data = array(typecode, [0]) * (w*h)
+        self.typecode = typecode
+
+    def tofile(self, f):
+        self.data.tofile(f)
+
+    def _idx(self, x, y):
+        if 0 <= x < self.width and 0 <= y < self.height:
+            return y*self.width + x
+        raise IndexError
+
+    def __getitem__(self, (x, y)):
+        return self.data[self._idx(x, y)]
+
+    def __setitem__(self, (x, y), val):
+        self.data[self._idx(x, y)] = val
+
+    def pixels(self, border=0):
+        for y in xrange(border, self.height-border):
+            for x in xrange(border, self.width-border):
+                yield x, y
+
+
+def sobel_magnitude(a):
+    b = Image(a.width, a.height, typecode='B')
+    for y in xrange(1, a.height-1):
+        for x in xrange(1, a.width-1):
+            dx = -1.0 * a[x-1, y-1] + 1.0 * a[x+1, y-1] + \
+                 -2.0 * a[x-1, y]   + 2.0 * a[x+1, y] + \
+                 -1.0 * a[x-1, y+1] + 1.0 * a[x+1, y+1]
+            dy = -1.0 * a[x-1, y-1] -2.0 * a[x, y-1] -1.0 * a[x+1, y-1] + \
+                  1.0 * a[x-1, y+1] +2.0 * a[x, y+1] +1.0 * a[x+1, y+1]
+            b[x, y] = min(int(sqrt(dx*dx + dy*dy) / 4.0), 255)
+
+    return b
+
+def sobel_magnitude_generator(a):
+    b = Image(a.width, a.height, typecode='B')
+    for x, y in a.pixels(border=1):
+        dx = -1.0 * a[x-1, y-1] + 1.0 * a[x+1, y-1] + \
+             -2.0 * a[x-1, y]   + 2.0 * a[x+1, y] + \
+             -1.0 * a[x-1, y+1] + 1.0 * a[x+1, y+1]
+        dy = -1.0 * a[x-1, y-1] -2.0 * a[x, y-1] -1.0 * a[x+1, y-1] + \
+              1.0 * a[x-1, y+1] +2.0 * a[x, y+1] +1.0 * a[x+1, y+1]
+        b[x, y] = min(int(sqrt(dx*dx + dy*dy) / 4.0), 255)
+
+    return b
+
+if __name__ == '__main__':
+    from io import mplayer, view
+    import sys
+    from time import time
+
+    if len(sys.argv) > 1:
+        fn = sys.argv[1]
+    else:
+        fn = 'test.avi -vf scale=640:480 -benchmark'
+
+    sys.setcheckinterval(2**30)
+    try:
+        import pypyjit
+        pypyjit.set_param(trace_limit=200000)
+    except ImportError:
+        pass
+
+    start = start0 = time()
+    for fcnt, img in enumerate(mplayer(Image, fn)):
+        #view(img)
+        view(sobel_magnitude(img))
+        #view(sobel_magnitude_generator(img))
+        #sobel_magnitude_generator(img)
+        #sobel_magnitude(img)
+        print 1.0 / (time() - start), 'fps, ', (fcnt-2) / (time() - start0), 'average fps'
+        start = time()
+        if fcnt==2:
+            start0 = time()
diff --git a/talk/iwtc11/benchmarks/image/sobel.cc b/talk/iwtc11/benchmarks/image/sobel.cc
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/sobel.cc
@@ -0,0 +1,51 @@
+// A safe array example.
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+class Array2D {
+  double *data;
+public:
+  int width, height;
+  Array2D(int w, int h) {
+    width = w;
+    height = h;
+    data = (double *) malloc(w*h*sizeof(double));
+  }
+  double &operator()(int x, int y) {
+    if (x >= 0 && x < width && y >= 0 && y < height) {
+	return data[y*width + x];
+    }
+    printf("IndexError\n");
+    exit(1);
+  }
+};
+
+void sobel_magnitude(Array2D &a, Array2D &b) {
+  int x, y;
+  for (y=1; y<a.height-1; y++) {
+    for (x=1; x<a.width-1; x++) {
+      double dx = -1.0*a(x-1, y-1) + 1.0*a(x+1, y-1) +
+	          -2.0*a(x-1, y)   + 2.0*a(x+1, y)   + 
+	          -1.0*a(x-1, y+1) + 1.0*a(x+1, y+1);
+
+      double dy = -1.0*a(x-1, y-1) - 2.0*a(x, y-1) - 1.0*a(x+1, y-1) +
+	           1.0*a(x-1, y+1) + 2.0*a(x, y+1) + 1.0*a(x+1, y+1);
+      b(x, y) = sqrt(dx*dx + dy*dy) / 4.0;
+
+    }
+  }
+}
+
+int main(int ac, char **av) {
+  int w = atoi(av[1]), h = atoi(av[2]);
+  int i;
+
+  for (i=0; i<10; i++) {
+    Array2D a(w, h), b(w, h);
+    sobel_magnitude(a, b);
+    printf("%f\n", b(1,1));
+  }
+  fprintf(stderr, "sobel(Array2D(%dx%d)):  ", w, h);
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/image/sobel.py b/talk/iwtc11/benchmarks/image/sobel.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/sobel.py
@@ -0,0 +1,86 @@
+from noborder import NoBorderImagePadded
+from math import sqrt
+
+def sobeldx(img):
+    res = img.clone(typecode='d')
+    for p in img.pixeliter():
+        res[p] = (-1.0 * img[p + (-1,-1)] + 1.0 * img[p + (1,-1)] + \
+                  -2.0 * img[p + (-1, 0)] + 2.0 * img[p + (1, 0)] + \
+                  -1.0 * img[p + (-1, 1)] + 1.0 * img[p + (1, 1)]) / 4.0
+    return res
+
+def sobeldy(img):
+    res = img.clone(typecode='d')
+    for p in img.pixeliter():
+        res[p] = (-1.0*img[p + (-1,-1)] -2.0*img[p + (0,-1)] -1.0*img[p + (1,-1)] + \
+                   1.0*img[p + (-1, 1)] +2.0*img[p + (0, 1)] +2.0*img[p + (1, 1)]) / 4.0
+    return res
+
+def sobel_magnitude(img):
+    res = img.clone(typecode='d')
+    for p in img.pixeliter():
+        dx = -1.0 * img[p + (-1,-1)] + 1.0 * img[p + (1,-1)] + \
+             -2.0 * img[p + (-1, 0)] + 2.0 * img[p + (1, 0)] + \
+             -1.0 * img[p + (-1, 1)] + 1.0 * img[p + (1, 1)]
+        dy = -1.0*img[p + (-1,-1)] -2.0*img[p + (0,-1)] -1.0*img[p + (1,-1)] + \
+              1.0*img[p + (-1, 1)] +2.0*img[p + (0, 1)] +1.0*img[p + (1, 1)]
+        res[p] = sqrt(dx*dx + dy*dy) / 4.0
+    return res
+
+def uint8(img):
+    res = img.clone(typecode='B')
+    for p in img.pixeliter():
+        res[p] = min(max(int(img[p]), 0), 255)
+    return res
+
+def sobel_magnitude_uint8(img):
+    res = img.clone(typecode='B')
+    for p in img.pixeliter():
+        dx = -1.0 * img[p + (-1,-1)] + 1.0 * img[p + (1,-1)] + \
+             -2.0 * img[p + (-1, 0)] + 2.0 * img[p + (1, 0)] + \
+             -1.0 * img[p + (-1, 1)] + 1.0 * img[p + (1, 1)]
+        dy = -1.0*img[p + (-1,-1)] -2.0*img[p + (0,-1)] -1.0*img[p + (1,-1)] + \
+              1.0*img[p + (-1, 1)] +2.0*img[p + (0, 1)] +1.0*img[p + (1, 1)]
+        res[p] = min(int(sqrt(dx*dx + dy*dy) / 4.0), 255)
+    return res
+
+def main(args):
+    Image = eval(args[0])
+    n = 1000
+    if len(args) == 1:
+        for i in range(10):
+            sobel_magnitude(Image(n, n))
+        return 'sobel(%s(%dx%d))' % (Image.__name__, n, n)
+    else:
+        for i in range(10):
+            sobel_magnitude_uint8(Image(n, n, typecode='B'))
+        return 'sobel_uint8(%s(%dx%d))' % (Image.__name__, n, n)
+
+if __name__ == '__main__':
+    from io import mplayer, view
+    import sys
+    from time import time
+
+    if len(sys.argv) > 1:
+        fn = sys.argv[1]
+    else:
+        fn = 'test.avi -vf scale=640:480 -benchmark'
+
+    sys.setcheckinterval(2**30)
+    try:
+        import pypyjit
+        pypyjit.set_param(trace_limit=200000)
+    except ImportError:
+        pass
+
+    start = start0 = time()
+    for fcnt, img in enumerate(mplayer(NoBorderImagePadded, fn)):
+        #view(img)
+        #sobeldx(img)
+        #view(uint8(sobel_magnitude(img)))
+        view(sobel_magnitude_uint8(img))
+        #sobel_magnitude_uint8(img)
+        print 1.0 / (time() - start), 'fps, ', (fcnt-2) / (time() - start0), 'average fps'
+        start = time()
+        if fcnt==2:
+            start0 = time()
diff --git a/talk/iwtc11/benchmarks/image/test.avi b/talk/iwtc11/benchmarks/image/test.avi
new file mode 100644
index 0000000000000000000000000000000000000000..e72f9f1b0e99f77baa54aa3f9ef4399b0b82ec45
GIT binary patch

[cut]

diff --git a/talk/iwtc11/benchmarks/image/test_image.py b/talk/iwtc11/benchmarks/image/test_image.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/test_image.py
@@ -0,0 +1,22 @@
+from noborder import *
+
+def test_noborder():
+    for Image in (NoBorderImagePadded, NoBorderImage):
+        a = Image(5, 5).setup([[11, 12, 13, 14, 15],
+                               [21, 22, 23, 24, 25],
+                               [31, 32, 33, 34, 35],
+                               [41, 42, 43, 44, 45],
+                               [51, 52, 53, 54, 55]])
+        k = Image(3, 3).setup([[1, 2, 3],
+                               [1, 1, 2],
+                               [2, 1, 1]])
+        def tst(conv, a, k):
+            b = conv(a, k)
+            assert b[1,1]== 326 and b[2,1]==340 and b[3,1]==354
+            assert b[1,2]== 466 and b[2,2]==480 and b[3,2]==494
+            assert b[1,3]== 606 and b[2,3]==620 and b[3,3]==634
+
+        for c in (conv3x3, conv3x3iter, conv3x3range):
+            yield tst, c, a, k
+
+    
diff --git a/talk/iwtc11/benchmarks/image/time_sobel.py b/talk/iwtc11/benchmarks/image/time_sobel.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/time_sobel.py
@@ -0,0 +1,29 @@
+from noborder import NoBorderImagePadded, NoBorderImage
+from sobel import sobel_magnitude, sobel_magnitude_uint8
+from time import time
+import sys
+
+sys.setcheckinterval(2**30)
+try:
+    import pypyjit
+    pypyjit.set_param(trace_limit=200000)
+except ImportError:
+    pass
+
+Image = eval(sys.argv[1])
+n = 1000
+
+sobel_magnitude(Image(n, n))
+sobel_magnitude_uint8(Image(n, n, typecode='B'))
+    
+a = time()
+for i in range(10):
+    sobel_magnitude(Image(n, n))
+b = time()
+print 'sobel(%s):' % Image.__name__, b - a
+
+a = time()
+for i in range(10):
+    sobel_magnitude_uint8(Image(n, n, typecode='B'))
+b = time()
+print 'sobel_uint8(%s):' % Image.__name__, b - a
diff --git a/talk/iwtc11/benchmarks/image/view.py b/talk/iwtc11/benchmarks/image/view.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/image/view.py
@@ -0,0 +1,6 @@
+from noborder import NoBorderImage
+from io import mplayer, view
+
+for img in mplayer(NoBorderImage, 'test.avi'):
+    view(img)
+    
diff --git a/talk/iwtc11/benchmarks/new_result.txt b/talk/iwtc11/benchmarks/new_result.txt
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/new_result.txt
@@ -0,0 +1,106 @@
+
+pypy
+sqrt(int): 1.81961710453 +- 0.00969663499951
+sqrt(float): 0.997122144699 +- 0.00475528903922
+sqrt(Fix16): 2.14047310352 +- 0.0175369211294
+conv3(1e6): 0.765250277519 +- 0.0111246299589
+conv5(1e6): 1.08676469326 +- 0.0181131040106
+conv3(1e5): 0.675209879875 +- 0.0210395038414
+conv5(1e5): 1.05374486446 +- 0.0284513681407
+conv3x3(3): 0.0678671360016 +- 0.00108163728271
+conv3x3(1000): 0.0530683040619 +- 0.0344658980996
+dilate3x3(1000): 0.389708518982 +- 0.00835149413747
+NoBorderImagePadded: 1.93399097919 +- 0.0524961558513
+NoBorderImagePadded(iter): 0.488634562492 +- 0.0171516205712
+NoBorderImagePadded(range): 0.483622479439 +- 0.00925072290815
+NoBorderImage: 2.16889901161 +- 0.0157656334579
+NoBorderImage(iter): 1.47057991028 +- 0.0233604904862
+NoBorderImage(range): 1.39746711254 +- 0.0358702404701
+sobel(NoBorderImagePadded): 0.47727098465 +- 0.0285302209995
+sobel_uint8(NoBorderImagePadded): 0.513068723679 +- 0.00450907878019
+
+pypy --jit enable_opts=intbounds:rewrite:virtualize:heap
+sqrt(int): 2.26462423801 +- 0.0076627615314
+sqrt(float): 1.35695979595 +- 0.0251587469884
+sqrt(Fix16): 3.93270061016 +- 0.109339327977
+conv3(1e6): 1.68973388672 +- 0.0142045606781
+conv5(1e6): 1.92141816616 +- 0.034837452752
+conv3(1e5): 1.77114777565 +- 0.0558894026315
+conv5(1e5): 1.86009068489 +- 0.0184543492536
+conv3x3(3): 0.0988693475723 +- 0.00115722747303
+conv3x3(1000): 0.0734650850296 +- 0.00267271135671
+dilate3x3(1000): 0.411496067047 +- 0.035852331563
+NoBorderImagePadded: 2.09047472477 +- 0.117371924965
+NoBorderImagePadded(iter): 1.2149545908 +- 0.0217855739412
+NoBorderImagePadded(range): 1.11978774071 +- 0.0280553099539
+NoBorderImage: 2.22395954132 +- 0.0316863806008
+NoBorderImage(iter): 1.44512989521 +- 0.0304946877295
+NoBorderImage(range): 1.34203736782 +- 0.0314288487567
+sobel(NoBorderImagePadded): 1.01348490715 +- 0.0263135905465
+sobel_uint8(NoBorderImagePadded): 1.04967999458 +- 0.0124143422099
+
+gcc -O2
+sqrt(float): 0.98 +- 1.24126707662e-16
+sqrt(int): 0.806 +- 0.00894427191
+sqrt(Fix16): 0.972 +- 0.01788854382
+conv3(1e6): 0.84 +- 0.0452769256907
+conv5(1e6): 1.074 +- 0.0517687164222
+conv3(1e5): 0.702 +- 0.0465832587954
+conv5(1e5): 1.03 +- 0.0484767985742
+conv3x3(3): 0.274 +- 0.00894427191
+conv3x3(1000): 0.242 +- 0.004472135955
+dilate3x3(1000): 0.258 +- 0.004472135955
+sobel_magnitude: 0.194 +- 0.00894427191
+
+gcc -O3 -march=native -fno-tree-vectorize
+sqrt(float): 0.98 +- 1.24126707662e-16
+sqrt(int): 0.804 +- 0.00894427191
+sqrt(Fix16): 0.96 +- 0.0122474487139
+conv3(1e6): 0.744 +- 0.011401754251
+conv5(1e6): 0.8 +- 0.0122474487139
+conv3(1e5): 0.588 +- 0.0130384048104
+conv5(1e5): 0.65 +- 0.0122474487139
+conv3x3(3): 0.274 +- 0.00547722557505
+conv3x3(1000): 0.25 +- 0.00707106781187
+dilate3x3(1000): 0.256 +- 0.00894427191
+sobel_magnitude: 0.2 +- 0.0141421356237
+
+python2.7
+sqrt(int): 20.8419699669
+sqrt(float): 24.2056779861
+sqrt(Fix16): 744.34590292
+conv3(1e6): 77.1459159851
+conv5(1e6): 125.768272161
+conv3(1e5): 77.8904190063
+conv5(1e5): 122.540805101
+conv3x3(3): 23.8474378586
+conv3x3(1000): 23.7241849899
+dilate3x3(1000): 23.2892370224
+NoBorderImagePadded: 543.731127977
+NoBorderImagePadded(iter): 546.704558849
+NoBorderImagePadded(range): 550.923794985
+NoBorderImage: 537.306480885
+NoBorderImage(iter): 548.317567825
+NoBorderImage(range): 534.642185926
+sobel(NoBorderImagePadded): 461.142298937
+sobel_uint8(NoBorderImagePadded): 476.717667103
+
+python2.6 psyco-wrapper.py
+sqrt(int): 1.77652692795
+sqrt(float): 5.52010679245
+sqrt(Fix16): 421.651717901
+conv3(1e6): 9.58111596107
+conv5(1e6): 16.7954330444
+conv3(1e5): 9.51570010185
+conv5(1e5): 16.6677658558
+conv3x3(3): 12.7717211246
+conv3x3(1000): 12.7678999901
+dilate3x3(1000): 12.9881358147
+NoBorderImagePadded: 333.201485157
+NoBorderImagePadded(iter): 309.316030979
+NoBorderImagePadded(range): 318.333670855
+NoBorderImage: 329.979980946
+NoBorderImage(iter): 304.132736921
+NoBorderImage(range): 317.337441921
+sobel(NoBorderImagePadded): 258.021892071
+sobel_uint8(NoBorderImagePadded): 275.499665976
diff --git a/talk/iwtc11/benchmarks/numpy/array.c b/talk/iwtc11/benchmarks/numpy/array.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/numpy/array.c
@@ -0,0 +1,38 @@
+
+// an equivalent using targetmicronumpy is aa+a+a+a+ with the same size
+
+#include <stdlib.h>
+#include <stdio.h>
+
+double *create_array(int size)
+{
+  int i;
+  double *a = (double*)malloc(size * sizeof(double));
+  for (i = 0; i < size; ++i) {
+    a[i] = (double)(i % 10);
+  }
+  return a;
+}
+
+#define MAX 5
+#define SIZE 10000000
+#define ITERATIONS 10
+
+int main()
+{
+  double *a[MAX];
+  double *res;
+  int i, k;
+
+  for (i = 0; i < MAX; ++i) {
+    a[i] = create_array(SIZE);
+  }
+  res = create_array(SIZE);
+  // actual loop
+  for (k = 0; k < ITERATIONS; ++k) {
+    for (i = 0; i < SIZE; ++i) {
+      res[i] = a[0][i] + a[1][i] + a[2][i] + a[3][i] + a[4][i];
+    }
+    printf("%f\n", res[125]); // to kill the optimizer
+  }
+}
diff --git a/talk/iwtc11/benchmarks/parse.py b/talk/iwtc11/benchmarks/parse.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/parse.py
@@ -0,0 +1,41 @@
+
+import pdb, sys
+
+def main(name):
+    interp = None
+    res = {}
+    order = ['python2.7', 'python2.6 psyco-wrapper.py', 'pypy --jit enable_opts=intbounds:rewrite:virtualize:heap', 'pypy', 'gcc -O2', 'gcc -O3 -march=native -fno-tree-vectorize']
+    with open(name) as f:
+        for line in f:
+            line = line.strip("\n")
+            if not line:
+                interp = None
+            elif interp is None:
+                interp = line
+            else:
+                bench, rest = line.split(':')
+                if '+-' in rest:
+                    a, d = rest.split('+-')
+                    res.setdefault(bench, {})[interp] = float(a), float(d)
+                else:
+                    res.setdefault(bench, {})[interp] = float(rest)
+    for key in sorted(res.keys()):
+        sys.stdout.write(key)
+        for ord in order:
+            try:
+                e = res[key][ord]
+            except KeyError:
+                sys.stdout.write(" & -")
+            else:
+                if isinstance(e, tuple):
+                    sys.stdout.write(' & %.2f +- %.2f' % (e[0], e[1]))
+                else:
+                    sys.stdout.write(' & %.2f' % e)
+        sys.stdout.write('\\\\\n')
+        print "\hline"
+
+if __name__ == '__main__':
+    try:
+        main('new_result.txt')
+    except:
+        pdb.post_mortem(sys.exc_info()[2])
diff --git a/talk/iwtc11/benchmarks/result.txt b/talk/iwtc11/benchmarks/result.txt
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/result.txt
@@ -0,0 +1,129 @@
+
+pypy
+sqrt(float):   1.20290899277
+  sqrt(int):   2.41840982437
+sqrt(Fix16):   6.10620713234
+conv3(1e8):    2.5192759037
+conv5(1e8):    2.89429306984
+conv3(1e6):    0.828789949417
+conv5(1e6):    1.01669406891
+conv3(1e5):    0.777491092682
+conv5(1e5):    0.971807956696
+conv3x3(3):    0.653658866882
+conv3x3(1000): 0.748742103577
+dilate3x3(1000): 4.8826611042
+NoBorderImagePadded: 2.31043601036
+NoBorderImagePadded(iter): 0.572638988495
+NoBorderImagePadded(range): 0.494098186493
+NoBorderImage: 2.90333104134
+NoBorderImage(iter): 2.06943392754
+NoBorderImage(range): 1.99161696434
+sobel(NoBorderImagePadded): 0.668392896652
+
+pypy --jit enable_opts=intbounds:rewrite:virtualize:heap:unroll
+sqrt(float):   1.19338798523
+  sqrt(int):   2.42711806297
+sqrt(Fix16):   6.12403416634
+conv3(1e8):    2.06937193871
+conv5(1e8):    2.26879811287
+conv3(1e6):    0.837247848511
+conv5(1e6):    1.02573990822
+conv3(1e5):    0.779927015305
+conv5(1e5):    0.975258827209
+conv3x3(3):    0.663229942322
+conv3x3(1000): 0.763913154602
+dilate3x3(1000): 4.80735611916
+NoBorderImagePadded: 2.33380198479
+NoBorderImagePadded(iter): 0.504709005356
+NoBorderImagePadded(range): 0.503198862076
+NoBorderImage: 2.93766593933
+NoBorderImage(iter): 2.04195189476
+NoBorderImage(range): 2.02779984474
+sobel(NoBorderImagePadded): 0.670017004013
+
+pypy --jit enable_opts=intbounds:rewrite:virtualize:heap
+sqrt(float):   1.69957995415
+  sqrt(int):   3.13235807419
+sqrt(Fix16):   10.325592041
+conv3(1e8):    2.997631073
+conv5(1e8):    3.13820099831
+conv3(1e6):    1.7843170166
+conv5(1e6):    1.94643998146
+conv3(1e5):    1.75876712799
+conv5(1e5):    1.96709895134
+conv3x3(3):    1.09958791733
+conv3x3(1000): 1.02993702888
+dilate3x3(1000): 5.22873902321
+NoBorderImagePadded: 2.45174002647
+NoBorderImagePadded(iter): 1.60747289658
+NoBorderImagePadded(range): 1.55282211304
+NoBorderImage: 2.91020989418
+NoBorderImage(iter): 1.97922706604
+NoBorderImage(range): 2.14161992073
+sobel(NoBorderImagePadded): 1.47591900826
+
+gcc
+sqrt(float):   1.43
+sqrt(int):     1.93
+sqrt(Fix16):   2.04
+conv3(1e8):     2.03
+conv5(1e8):     2.39
+conv3(1e6):     1.66
+conv5(1e6):     2.03
+conv3(1e5):     1.60
+conv5(1e5):     2.02
+conv3x3(3):  1.81
+conv3x3(1000):  1.79
+dilate3x3(1000):  3.26
+sobel_magnitude:  1.37
+
+gcc -O2
+sqrt(float):   1.15
+sqrt(int):     1.86
+sqrt(Fix16):   1.89
+conv3(1e8):     1.22
+conv5(1e8):     1.37
+conv3(1e6):     1.00
+conv5(1e6):     1.04
+conv3(1e5):     0.81
+conv5(1e5):     0.97
+conv3x3(3):  0.25
+conv3x3(1000):  0.23
+dilate3x3(1000):  0.27
+sobel_magnitude:  0.25
+
+gcc -O3 -march=native
+sqrt(float):   1.15
+sqrt(int):     1.82
+sqrt(Fix16):   1.89
+conv3(1e8):     1.12
+conv5(1e8):     1.16
+conv3(1e6):     0.96
+conv5(1e6):     0.97
+conv3(1e5):     0.66
+conv5(1e5):     0.75
+conv3x3(3):  0.23
+conv3x3(1000):  0.21
+dilate3x3(1000):  0.26
+sobel_magnitude:  0.25
+
+python2.7
+sqrt(float):   34.9008591175
+  sqrt(int):   19.6919620037
+sqrt(Fix16):   966.111785889
+conv3(1e8):    69.0758299828
+conv5(1e8):    101.503945827
+conv3(1e6):    62.212736845
+conv5(1e6):    93.5375850201
+conv3(1e5):    61.4343979359
+conv5(1e5):    93.6144771576
+conv3x3(3):    198.12590003
+conv3x3(1000): 193.030704975
+dilate3x3(1000): 192.323596954
+NoBorderImagePadded: 512.473811865
+NoBorderImagePadded(iter): 503.393321991
+NoBorderImagePadded(range): 493.907886028
+NoBorderImage: 501.37309289
+NoBorderImage(iter): 495.473101139
+NoBorderImage(range): 493.572232008
+sobel(NoBorderImagePadded): 433.678281069
diff --git a/talk/iwtc11/benchmarks/runall.sh b/talk/iwtc11/benchmarks/runall.sh
new file mode 100755
--- /dev/null
+++ b/talk/iwtc11/benchmarks/runall.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+./benchmark.sh pypy
+#./benchmark.sh pypy --jit enable_opts=intbounds:rewrite:virtualize:heap:unroll
+./benchmark.sh pypy --jit enable_opts=intbounds:rewrite:virtualize:heap
+#./benchmark.sh gcc
+#./benchmark.sh gcc -O2
+./benchmark.sh gcc -O3 -march=native -fno-tree-vectorize
+./benchmark.sh python2.7
+./benchmark.sh python2.6 psyco-wrapper.py
diff --git a/talk/iwtc11/benchmarks/runner.py b/talk/iwtc11/benchmarks/runner.py
new file mode 100755
--- /dev/null
+++ b/talk/iwtc11/benchmarks/runner.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+""" Usage:
+
+runner.py [-w warmup] [-n times] [-c compile_command] <file> <extra_args>
+
+Where extra_args is either what you pass to python file, if file ends with .py
+or a C compiler and it's options
+"""
+
+from __future__ import division
+
+import py
+import sys
+import time
+from optparse import OptionParser
+import subprocess
+
+def main():
+    parser = OptionParser()
+    parser.add_option('-n', dest='no', help='number of iterations', type=int,
+                      default=10)
+    parser.add_option('-w', dest='warmup', help='number of warmup runs',
+                      type=int, default=3)
+    parser.add_option('-c', dest='compile_command',
+                      help='for *.c a compile command')
+    options, args = parser.parse_args()
+    try:
+        import pypyjit
+    except ImportError:
+        pass
+    else:
+        pypyjit.set_param(trace_limit=200000)
+    if args[0].endswith('.py'):
+        mod = py.path.local(args[0]).pyimport()
+        sys.stderr.write("warming up")
+        func = getattr(mod, args[1])
+        args = args[2:]
+        for i in range(options.warmup):
+            func(args)
+            sys.stderr.write('.')
+        sys.stderr.write("\n")
+        print >>sys.stderr, "benchmarking"
+        all = []
+        for i in range(options.no):
+            t0 = time.time()
+            name = func(args)
+            all.append(time.time() - t0)
+            print >>sys.stderr, "Next:", all[-1]
+    else:
+        # not needed
+        options.warmup = 0
+        all = []
+        l = options.compile_command.split(" ") + [args[0]]
+        pipe = subprocess.Popen(l, stderr=subprocess.PIPE,
+                                stdout=subprocess.PIPE)
+        pipe.wait()
+        print >>sys.stderr, pipe.stdout.read()
+        print >>sys.stderr, pipe.stderr.read()
+        for i in range(options.no):
+            pipe = subprocess.Popen(['/usr/bin/time', '-f', '%e', './a.out']
+                                    + args[1:],
+                                     stderr=subprocess.PIPE,
+                                     stdout=subprocess.PIPE)
+            pipe.wait()
+            l = pipe.stderr.read().split(" ")
+            v = float(l[-1].strip("\n"))
+            all.append(v)
+            name = l[0][:-1] # strip :
+            print >>sys.stderr, "Next: %s" % (v,)
+
+    print >>sys.stderr, "benchmarked", name
+    if options.no > 1:
+        avg = sum(all) / len(all)
+        stddev = (sum([(i - avg) * (i - avg) for i in all]) / (len(all) - 1)) ** 0.5
+        print "%s: %s +- %s" % (name, avg, stddev)
+    else:
+        print "%s: %s" % (name, all[0])
+
+if __name__ == '__main__':
+    main()
diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt.py b/talk/iwtc11/benchmarks/sqrt/sqrt.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt.py
@@ -0,0 +1,54 @@
+def sqrt(y, n=10000):
+    x = y / 2
+    while n > 0:
+        #assert y > 0 and x > 0
+        n -= 1
+        x = (x + y/x) / 2
+    return x
+
+class Fix16(object):
+    def __init__(self, val, scale=True):
+        if isinstance(val, Fix16):
+            self.val = val.val
+        else:
+            if scale:
+                self.val = int(val * 2**16)
+            else:
+                self.val = val
+        #assert self.val <= 2147483647>>8
+
+    def __add__(self, other):
+        return  Fix16(self.val + Fix16(other).val, False)
+
+    def __sub__(self, other):
+        return  Fix16(self.val - Fix16(other).val, False)
+
+    def __mul__(self, other):
+        return  Fix16((self.val >> 8) * (Fix16(other).val >> 8), False)
+
+    def __div__(self, other):
+        return  Fix16((self.val << 8) / (Fix16(other).val >> 8), False)
+
+
+    def __float__(self):
+        return float(self.val) / float(2**16)
+
+    def __int__(self):
+        return self.val >> 16
+
+    def __cmp__(self, other):
+        return cmp(self.val, Fix16(other).val)
+
+    def __str__(self):
+        return str(float(self))
+
+    __radd__ = __add__
+    __rmul__ = __mul__
+    def __rsub__(self, other):
+        return  Fix16(Fix16(other).val - self.val, False)
+    def __rdiv__(self, other):
+        return  Fix16((Fix16(other).val << 8) / (self.val >> 8), False)
+
+def main(argv):
+    sqrt(eval(argv[0])(123), 100000000)
+    return 'sqrt(%s)' % argv[0]
diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt_double.c b/talk/iwtc11/benchmarks/sqrt/sqrt_double.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt_double.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+int main() {
+  double y = 1234.0;
+  double x = y / 2.0;
+  long n = 100000000;
+  while (n>0) {
+    n -= 1;
+    x = (x + y/x) / 2.0;
+  }
+  printf("%f\n", x);
+  fprintf(stderr, "sqrt(float):   ");
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt_fix16.c b/talk/iwtc11/benchmarks/sqrt/sqrt_fix16.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt_fix16.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+int main() {
+  long y = 123 << 16;
+  long x = y / 2;
+  long n = 100000000;
+  while (n>0) {
+    n -= 1;
+    x = ((x + (y << 8)/(x >> 8))) / 2;
+  }
+  printf("%f\n", ((double) x) / ((double) (1<<16)));
+  fprintf(stderr, "sqrt(Fix16):   ");
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt_long.c b/talk/iwtc11/benchmarks/sqrt/sqrt_long.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt_long.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+int main() {
+  long y = 1234;
+  long x = y / 2;
+  long n = 100000000;
+  while (n>0) {
+    n -= 1;
+    x = (x + y/x) / 2;
+  }
+  printf("%d\n", x);
+  fprintf(stderr, "sqrt(int):     ");
+  return 0;
+}
diff --git a/talk/iwtc11/benchmarks/sqrt/test_sqrt.py b/talk/iwtc11/benchmarks/sqrt/test_sqrt.py
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/sqrt/test_sqrt.py
@@ -0,0 +1,6 @@
+import math
+from sqrt import sqrt, Fix16
+
+for i in range(2,10) + [123]:
+    print i, sqrt(i), '%4.2f' % sqrt(float(i)), \
+          '%4.2f' % float(sqrt(Fix16(i))), '%4.2f' % math.sqrt(i)
diff --git a/talk/iwtc11/figures/overview.pdf b/talk/iwtc11/figures/overview.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..62bc2404ecd4e1463078d4fc65bd55ecf1710eaa
GIT binary patch

[cut]

diff --git a/talk/iwtc11/figures/overview.svg b/talk/iwtc11/figures/overview.svg
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/figures/overview.svg
@@ -0,0 +1,1080 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:ns0="http://www.iki.fi/pav/software/textext/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="235.24512"
+   height="508.50427"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="overview.svg">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="48.553559"
+     inkscape:cy="198.08312"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1176"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="30"
+     fit-margin-left="30"
+     fit-margin-right="30"
+     fit-margin-bottom="30">
+    <inkscape:grid
+       snapvisiblegridlinesonly="true"
+       enabled="true"
+       visible="true"
+       empspacing="5"
+       type="xygrid"
+       id="grid3557" />
+  </sodipodi:namedview>
+  <defs
+     id="defs4">
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         id="path5512" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         id="path5512-3" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         id="path5512-0" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend-60"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         id="path5512-8" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend-66"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         id="path5512-4" />
+    </marker>
+  </defs>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(5.6959095,-25.699821)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1">
+    <rect
+       y="90.326416"
+       x="24.653536"
+       height="78.076286"
+       width="146.41783"
+       id="rect2985"
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:0.46976614;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.43990937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
+       d="m 130.36039,169.05518 c 24.45165,27.09473 70.14646,10.06275 68.94565,-36.70102 -1.72092,-67.018489 -57.92237,-58.980562 -68.34439,-42.846894"
+       id="path3559"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csc" />
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="g4683"
+       transform="matrix(1,0,0,-1,-194.6967,832.84394)"
+       xml:space="preserve"
+       stroke-miterlimit="10.433"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       ns0:text="$\\mathtt{ops}~\\cdots$"
+       ns0:preamble="">
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 228.09,709.28 -0.01,0.11 0,0.12 -0.02,0.11 -0.02,0.11 -0.02,0.11 -0.03,0.1 -0.03,0.11 -0.04,0.1 -0.04,0.1 -0.04,0.09 -0.05,0.1 -0.06,0.09 -0.05,0.08 -0.06,0.09 -0.07,0.08 -0.07,0.08 -0.07,0.07 -0.07,0.07 -0.08,0.07 -0.08,0.06 -0.08,0.05 -0.09,0.06 -0.09,0.05 -0.09,0.04 -0.09,0.04 -0.09,0.03 -0.1,0.03 -0.1,0.03 -0.1,0.02 -0.1,0.01 -0.1,0.01 -0.11,0 c -1.11,0 -2.04,-0.98 -2.04,-2.22 0,-1.27 0.95,-2.21 2.04,-2.21 v 0.6 c -0.73,0 -1.35,0.75 -1.35,1.67 0,0.91 0.65,1.56 1.35,1.56 0.72,0 1.36,-0.65 1.36,-1.56 0,-0.92 -0.62,-1.67 -1.36,-1.67 h 0 v -0.6 c 1.1,0 2.05,0.95 2.05,2.21 z"
+   id="path4685" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 230.32,707.57 0.04,-0.04 0.03,-0.03 0.04,-0.04 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.02 0.03,-0.03 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.03,-0.02 0.04,-0.01 0.04,-0.02 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.04,-0.01 0.03,-0.01 0.04,0 0.03,-0.01 0.03,0 0.07,-0.01 0.06,0 0.06,0 -0.03,0.6 c -0.77,0 -1.12,0.88 -1.12,1.36 v 0.72 c 0,0.59 0.58,1.12 1.2,1.12 0.74,0 1.32,-0.73 1.32,-1.59 0,-0.96 -0.7,-1.61 -1.4,-1.61 l 0.03,-0.6 c 1.09,0 2.06,0.94 2.06,2.21 0,1.22 -0.89,2.19 -1.95,2.19 -0.48,0 -0.92,-0.18 -1.26,-0.48 0,0.29 -0.02,0.42 -0.4,0.42 h -0.73 c -0.16,0 -0.41,0 -0.41,-0.3 0,-0.3 0.26,-0.3 0.4,-0.3 h 0.45 v -5.29 h -0.44 c -0.16,0 -0.41,0 -0.41,-0.31 0,-0.29 0.26,-0.29 0.4,-0.29 h 1.59 c 0.13,0 0.39,0 0.39,0.29 0,0.31 -0.25,0.31 -0.4,0.31 h -0.44 z"
+   id="path4687" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 236.86,709.66 -0.04,0.01 -0.04,0.01 -0.08,0.01 -0.09,0.02 -0.08,0.01 -0.04,0.01 -0.04,0 -0.04,0.01 -0.05,0.01 -0.04,0.01 -0.04,0 -0.05,0.01 -0.05,0.01 c -0.28,0.04 -0.96,0.16 -0.96,0.55 0,0.26 0.32,0.57 1.26,0.57 0.83,0 0.97,-0.3 1,-0.56 0.01,-0.17 0.03,-0.34 0.34,-0.34 0.35,0 0.35,0.21 0.35,0.41 v 0.69 c 0,0.16 0,0.4 -0.3,0.4 -0.24,0 -0.28,-0.14 -0.3,-0.21 -0.44,0.21 -0.88,0.21 -1.07,0.21 -1.66,0 -1.89,-0.81 -1.89,-1.17 0,-0.92 1.05,-1.09 1.96,-1.22 0.49,-0.08 1.29,-0.21 1.29,-0.74 0,-0.37 -0.37,-0.7 -1.28,-0.7 -0.46,0 -1.02,0.11 -1.27,0.89 -0.05,0.18 -0.09,0.29 -0.35,0.29 -0.35,0 -0.35,-0.21 -0.35,-0.41 v -0.97 c 0,-0.16 0,-0.4 0.3,-0.4 0.09,0 0.25,0.01 0.37,0.37 0.49,-0.35 1.01,-0.37 1.29,-0.37 1.58,0 1.9,0.82 1.9,1.3 0,1.03 -1.29,1.24 -1.61,1.29 z"
+   id="path4689" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 246.02,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 0,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0.01 -0.02,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4691" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 250.45,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.01,0.02 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0.01 -0.02,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4693" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 254.87,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.01,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4695" />
+</g>    <path
+       style="fill:none;stroke:#000000;stroke-width:0.56020665;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
+       d="m 130.34688,360.24472 c -4.34571,33.35282 -2.53599,27.89002 -4.9355,51.3554"
+       id="path3559-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5949"
+       transform="matrix(1,0,0,-1,-194.77036,1154.311)"
+       xml:space="preserve"
+       stroke-miterlimit="10.433"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       ns0:text="$\\mathtt{copy~of~ops}~\\cdots$"
+       ns0:preamble=""
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0">
+<path
+   d="m 228.08,708.21 0,0.01 0,0.02 0,0.01 -0.01,0.01 0,0.01 0,0.01 0,0.01 -0.01,0.01 0,0.01 0,0.01 -0.01,0.01 0,0.01 0,0.01 -0.01,0.01 0,0 -0.01,0.01 0,0.01 -0.01,0 -0.01,0.01 0,0.01 -0.01,0 0,0.01 -0.02,0.01 -0.01,0.01 -0.02,0.01 -0.01,0.01 -0.02,0 -0.01,0.01 -0.02,0 -0.01,0.01 -0.02,0 -0.01,0.01 -0.01,0 -0.02,0 -0.01,0 -0.02,0.01 -0.01,0 -0.01,0 -0.01,0 -0.01,0 -0.01,0 -0.01,0 0,0 0,0 c -0.16,0 -0.26,-0.02 -0.33,-0.22 -0.06,-0.13 -0.25,-0.6 -0.99,-0.6 -0.84,0 -1.56,0.7 -1.56,1.61 0,0.47 0.28,1.62 1.62,1.62 0.21,0 0.6,0 0.6,-0.09 0.01,-0.35 0.2,-0.49 0.44,-0.49 0.24,0 0.45,0.17 0.45,0.46 0,0.72 -1.04,0.72 -1.49,0.72 -1.71,0 -2.31,-1.35 -2.31,-2.22 0,-1.2 0.94,-2.21 2.19,-2.21 1.39,0 1.73,0.97 1.73,1.14 z"
+   id="path5951"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 233.32,709.28 0,0.11 -0.01,0.12 -0.02,0.11 -0.01,0.11 -0.03,0.11 -0.02,0.1 -0.04,0.11 -0.03,0.1 -0.05,0.1 -0.04,0.09 -0.05,0.1 -0.05,0.09 -0.06,0.08 -0.06,0.09 -0.07,0.08 -0.07,0.08 -0.07,0.07 -0.07,0.07 -0.08,0.07 -0.08,0.06 -0.08,0.05 -0.09,0.06 -0.09,0.05 -0.09,0.04 -0.09,0.04 -0.09,0.03 -0.1,0.03 -0.1,0.03 -0.1,0.02 -0.1,0.01 -0.1,0.01 -0.11,0 c -1.11,0 -2.04,-0.98 -2.04,-2.22 0,-1.27 0.95,-2.21 2.04,-2.21 v 0.6 c -0.73,0 -1.35,0.75 -1.35,1.67 0,0.91 0.65,1.56 1.35,1.56 0.72,0 1.36,-0.65 1.36,-1.56 0,-0.92 -0.62,-1.67 -1.36,-1.67 h 0 v -0.6 c 1.1,0 2.05,0.95 2.05,2.21 z"
+   id="path5953"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 235.55,707.57 0.04,-0.04 0.03,-0.03 0.04,-0.04 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.02 0.03,-0.03 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.03,-0.02 0.04,-0.01 0.04,-0.02 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.03,-0.01 0.04,0 0.03,-0.01 0.03,0 0.07,-0.01 0.06,0 0.06,0 -0.03,0.6 c -0.77,0 -1.12,0.88 -1.12,1.36 v 0.72 c 0,0.59 0.58,1.12 1.2,1.12 0.74,0 1.32,-0.73 1.32,-1.59 0,-0.96 -0.7,-1.61 -1.4,-1.61 l 0.03,-0.6 c 1.09,0 2.06,0.94 2.06,2.21 0,1.22 -0.89,2.19 -1.95,2.19 -0.47,0 -0.92,-0.18 -1.26,-0.48 0,0.29 -0.02,0.42 -0.4,0.42 h -0.73 c -0.16,0 -0.41,0 -0.41,-0.3 0,-0.3 0.26,-0.3 0.4,-0.3 h 0.45 v -5.29 h -0.44 c -0.16,0 -0.41,0 -0.41,-0.31 0,-0.29 0.26,-0.29 0.4,-0.29 H 236 c 0.14,0 0.4,0 0.4,0.29 0,0.31 -0.25,0.31 -0.41,0.31 h -0.44 z"
+   id="path5955"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 243.41,710.81 h 0.3 c 0.15,0 0.4,0 0.4,0.3 0,0.3 -0.24,0.3 -0.4,0.3 h -1.17 c -0.15,0 -0.4,0 -0.4,-0.29 0,-0.31 0.24,-0.31 0.4,-0.31 h 0.28 l -0.72,-2.12 c -0.13,-0.37 -0.19,-0.55 -0.26,-0.86 h -0.01 c -0.04,0.19 -0.13,0.4 -0.21,0.59 l -0.92,2.39 h 0.25 c 0.15,0 0.4,0 0.4,0.3 0,0.3 -0.24,0.3 -0.4,0.3 h -1.17 c -0.16,0 -0.4,0 -0.4,-0.3 0,-0.3 0.25,-0.3 0.4,-0.3 h 0.31 l 1.42,-3.56 c 0.03,-0.09 0.03,-0.11 0.03,-0.13 0,-0.02 -0.24,-0.83 -0.37,-1.08 -0.29,-0.55 -0.65,-0.57 -0.8,-0.58 0,0.01 0.05,0.09 0.05,0.22 0,0.25 -0.18,0.43 -0.43,0.43 -0.27,0 -0.44,-0.18 -0.44,-0.44 0,-0.42 0.34,-0.81 0.83,-0.81 1,0 1.44,1.31 1.48,1.42 z"
+   id="path5957"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 252.33,709.28 -0.01,0.11 0,0.12 -0.02,0.11 -0.02,0.11 -0.02,0.11 -0.03,0.1 -0.03,0.11 -0.04,0.1 -0.04,0.1 -0.04,0.09 -0.05,0.1 -0.06,0.09 -0.05,0.08 -0.06,0.09 -0.07,0.08 -0.07,0.08 -0.07,0.07 -0.07,0.07 -0.08,0.07 -0.08,0.06 -0.08,0.05 -0.09,0.06 -0.09,0.05 -0.09,0.04 -0.09,0.04 -0.09,0.03 -0.1,0.03 -0.1,0.03 -0.1,0.02 -0.1,0.01 -0.1,0.01 -0.11,0 c -1.11,0 -2.04,-0.98 -2.04,-2.22 0,-1.27 0.95,-2.21 2.04,-2.21 v 0.6 c -0.74,0 -1.35,0.75 -1.35,1.67 0,0.91 0.64,1.56 1.35,1.56 0.72,0 1.36,-0.65 1.36,-1.56 0,-0.92 -0.62,-1.67 -1.36,-1.67 h 0 v -0.6 c 1.1,0 2.05,0.95 2.05,2.21 z"
+   id="path5959"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 255.42,710.81 h 1.22 c 0.15,0 0.4,0 0.4,0.3 0,0.3 -0.24,0.3 -0.4,0.3 h -1.22 v 0.47 c 0,0.78 0.67,0.78 0.97,0.78 0,-0.04 0.09,-0.43 0.44,-0.43 0.2,0 0.43,0.16 0.43,0.44 0,0.6 -0.8,0.6 -0.96,0.6 -0.8,0 -1.56,-0.46 -1.56,-1.33 v -0.53 h -1 c -0.16,0 -0.41,0 -0.41,-0.3 0,-0.3 0.25,-0.3 0.4,-0.3 h 1.01 v -3.08 h -1.01 c -0.15,0 -0.41,0 -0.41,-0.3 0,-0.31 0.26,-0.31 0.41,-0.31 h 2.7 c 0.15,0 0.41,0 0.41,0.3 0,0.31 -0.26,0.31 -0.41,0.31 h -1.01 z"
+   id="path5961"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 266.11,709.28 0,0.11 -0.01,0.12 -0.01,0.11 -0.02,0.11 -0.02,0.11 -0.03,0.1 -0.03,0.11 -0.04,0.1 -0.04,0.1 -0.05,0.09 -0.04,0.1 -0.06,0.09 -0.06,0.08 -0.06,0.09 -0.06,0.08 -0.07,0.08 -0.07,0.07 -0.07,0.07 -0.08,0.07 -0.08,0.06 -0.09,0.05 -0.08,0.06 -0.09,0.05 -0.09,0.04 -0.09,0.04 -0.1,0.03 -0.09,0.03 -0.1,0.03 -0.1,0.02 -0.1,0.01 -0.1,0.01 -0.11,0 c -1.12,0 -2.04,-0.98 -2.04,-2.22 0,-1.27 0.94,-2.21 2.04,-2.21 v 0.6 c -0.74,0 -1.36,0.75 -1.36,1.67 0,0.91 0.65,1.56 1.36,1.56 0.72,0 1.36,-0.65 1.36,-1.56 0,-0.92 -0.62,-1.67 -1.36,-1.67 h 0 v -0.6 c 1.1,0 2.04,0.95 2.04,2.21 z"
+   id="path5963"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 268.34,707.57 0.04,-0.04 0.04,-0.03 0.04,-0.04 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.03,-0.03 0.04,-0.02 0.04,-0.03 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.03,-0.02 0.04,-0.02 0.04,-0.01 0.04,-0.02 0.03,-0.01 0.04,-0.01 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.03,0 0.04,-0.01 0.03,0 0.07,-0.01 0.06,0 0.06,0 -0.03,0.6 c -0.78,0 -1.13,0.88 -1.13,1.36 v 0.72 c 0,0.59 0.58,1.12 1.21,1.12 0.74,0 1.32,-0.73 1.32,-1.59 0,-0.96 -0.7,-1.61 -1.4,-1.61 l 0.03,-0.6 c 1.09,0 2.05,0.94 2.05,2.21 0,1.22 -0.88,2.19 -1.94,2.19 -0.48,0 -0.93,-0.18 -1.27,-0.48 0,0.29 -0.02,0.42 -0.39,0.42 h -0.73 c -0.16,0 -0.41,0 -0.41,-0.3 0,-0.3 0.26,-0.3 0.4,-0.3 h 0.45 v -5.29 h -0.44 c -0.16,0 -0.41,0 -0.41,-0.31 0,-0.29 0.26,-0.29 0.4,-0.29 h 1.58 c 0.14,0 0.4,0 0.4,0.29 0,0.31 -0.25,0.31 -0.41,0.31 h -0.44 z"
+   id="path5965"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 274.89,709.66 -0.04,0.01 -0.04,0.01 -0.09,0.01 -0.08,0.02 -0.08,0.01 -0.08,0.01 -0.05,0.01 -0.04,0.01 -0.04,0.01 -0.05,0 -0.04,0.01 -0.05,0.01 c -0.29,0.04 -0.96,0.16 -0.96,0.55 0,0.26 0.32,0.57 1.26,0.57 0.83,0 0.97,-0.3 1,-0.56 0.01,-0.17 0.03,-0.34 0.34,-0.34 0.35,0 0.35,0.21 0.35,0.41 v 0.69 c 0,0.16 0,0.4 -0.3,0.4 -0.24,0 -0.28,-0.14 -0.3,-0.21 -0.44,0.21 -0.88,0.21 -1.07,0.21 -1.66,0 -1.89,-0.81 -1.89,-1.17 0,-0.92 1.04,-1.09 1.96,-1.22 0.49,-0.08 1.29,-0.21 1.29,-0.74 0,-0.37 -0.37,-0.7 -1.28,-0.7 -0.47,0 -1.03,0.11 -1.28,0.89 -0.04,0.18 -0.08,0.29 -0.34,0.29 -0.35,0 -0.35,-0.21 -0.35,-0.41 v -0.97 c 0,-0.16 0,-0.4 0.3,-0.4 0.09,0 0.25,0.01 0.36,0.37 0.49,-0.35 1.02,-0.37 1.3,-0.37 1.58,0 1.89,0.82 1.89,1.3 0,1.03 -1.28,1.24 -1.6,1.29 z"
+   id="path5967"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 284.04,709.61 0,0.03 0,0.03 0,0.02 -0.01,0.03 0,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.02,0 -0.03,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0 c -0.28,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.25,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path5969"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 288.47,709.61 0,0.03 0,0.03 0,0.02 -0.01,0.03 0,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.02 -0.01,0.03 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.02,0.02 -0.03,0.01 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0 -0.03,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.02,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.28,0 0.52,0.23 0.52,0.52 z"
+   id="path5971"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+<path
+   d="m 292.89,709.61 0,0.03 0,0.03 0,0.02 -0.01,0.03 0,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.02 -0.01,0.03 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.02,0.02 -0.03,0.01 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0 -0.03,0.01 -0.02,0 -0.03,0.01 -0.03,0 -0.02,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.28,0 0.52,0.23 0.52,0.52 z"
+   id="path5973"
+   inkscape:connector-curvature="0"
+   style="fill:#000000;stroke-width:0" />
+</g>    <text
+       xml:space="preserve"
+       style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="24.218153"
+       y="64.057243"
+       id="text7840"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7842"
+         x="24.218153"
+         y="64.057243">Original Loop:</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="24.218153"
+       y="254.05722"
+       id="text7840-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7842-5"
+         x="24.218153"
+         y="254.05722">After Loop Peeling:</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="117.34223"
+       y="294.81015"
+       id="text7840-9-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7842-5-0"
+         x="117.34223"
+         y="294.81015">Preamble</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="102.34222"
+       y="424.81018"
+       id="text7840-9-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7842-5-8"
+         x="102.34222"
+         y="424.81018">Peeled Loop</tspan></text>
+    <rect
+       y="282.32642"
+       x="24.653536"
+       height="78.076286"
+       width="146.41783"
+       id="rect2985-1"
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:0.46976614;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="g4683-0"
+       transform="matrix(1,0,0,-1,-194.6967,1024.8439)"
+       xml:space="preserve"
+       stroke-miterlimit="10.433"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       ns0:text="$\\mathtt{ops}~\\cdots$"
+       ns0:preamble="">
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 228.09,709.28 -0.01,0.11 0,0.12 -0.02,0.11 -0.02,0.11 -0.02,0.11 -0.03,0.1 -0.03,0.11 -0.04,0.1 -0.04,0.1 -0.04,0.09 -0.05,0.1 -0.06,0.09 -0.05,0.08 -0.06,0.09 -0.07,0.08 -0.07,0.08 -0.07,0.07 -0.07,0.07 -0.08,0.07 -0.08,0.06 -0.08,0.05 -0.09,0.06 -0.09,0.05 -0.09,0.04 -0.09,0.04 -0.09,0.03 -0.1,0.03 -0.1,0.03 -0.1,0.02 -0.1,0.01 -0.1,0.01 -0.11,0 c -1.11,0 -2.04,-0.98 -2.04,-2.22 0,-1.27 0.95,-2.21 2.04,-2.21 v 0.6 c -0.73,0 -1.35,0.75 -1.35,1.67 0,0.91 0.65,1.56 1.35,1.56 0.72,0 1.36,-0.65 1.36,-1.56 0,-0.92 -0.62,-1.67 -1.36,-1.67 h 0 v -0.6 c 1.1,0 2.05,0.95 2.05,2.21 z"
+   id="path4685-75" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 230.32,707.57 0.04,-0.04 0.03,-0.03 0.04,-0.04 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.03 0.04,-0.02 0.03,-0.03 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.04,-0.02 0.03,-0.02 0.04,-0.01 0.04,-0.02 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.03,-0.01 0.04,-0.01 0.04,-0.01 0.03,-0.01 0.04,0 0.03,-0.01 0.03,0 0.07,-0.01 0.06,0 0.06,0 -0.03,0.6 c -0.77,0 -1.12,0.88 -1.12,1.36 v 0.72 c 0,0.59 0.58,1.12 1.2,1.12 0.74,0 1.32,-0.73 1.32,-1.59 0,-0.96 -0.7,-1.61 -1.4,-1.61 l 0.03,-0.6 c 1.09,0 2.06,0.94 2.06,2.21 0,1.22 -0.89,2.19 -1.95,2.19 -0.48,0 -0.92,-0.18 -1.26,-0.48 0,0.29 -0.02,0.42 -0.4,0.42 h -0.73 c -0.16,0 -0.41,0 -0.41,-0.3 0,-0.3 0.26,-0.3 0.4,-0.3 h 0.45 v -5.29 h -0.44 c -0.16,0 -0.41,0 -0.41,-0.31 0,-0.29 0.26,-0.29 0.4,-0.29 h 1.59 c 0.13,0 0.39,0 0.39,0.29 0,0.31 -0.25,0.31 -0.4,0.31 h -0.44 z"
+   id="path4687-8" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 236.86,709.66 -0.04,0.01 -0.04,0.01 -0.08,0.01 -0.09,0.02 -0.08,0.01 -0.04,0.01 -0.04,0 -0.04,0.01 -0.05,0.01 -0.04,0.01 -0.04,0 -0.05,0.01 -0.05,0.01 c -0.28,0.04 -0.96,0.16 -0.96,0.55 0,0.26 0.32,0.57 1.26,0.57 0.83,0 0.97,-0.3 1,-0.56 0.01,-0.17 0.03,-0.34 0.34,-0.34 0.35,0 0.35,0.21 0.35,0.41 v 0.69 c 0,0.16 0,0.4 -0.3,0.4 -0.24,0 -0.28,-0.14 -0.3,-0.21 -0.44,0.21 -0.88,0.21 -1.07,0.21 -1.66,0 -1.89,-0.81 -1.89,-1.17 0,-0.92 1.05,-1.09 1.96,-1.22 0.49,-0.08 1.29,-0.21 1.29,-0.74 0,-0.37 -0.37,-0.7 -1.28,-0.7 -0.46,0 -1.02,0.11 -1.27,0.89 -0.05,0.18 -0.09,0.29 -0.35,0.29 -0.35,0 -0.35,-0.21 -0.35,-0.41 v -0.97 c 0,-0.16 0,-0.4 0.3,-0.4 0.09,0 0.25,0.01 0.37,0.37 0.49,-0.35 1.01,-0.37 1.29,-0.37 1.58,0 1.9,0.82 1.9,1.3 0,1.03 -1.29,1.24 -1.61,1.29 z"
+   id="path4689-7" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 246.02,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 0,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0.01 -0.02,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4691-0" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 250.45,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.01,0.02 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0.01 -0.02,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4693-4" />
+<path
+   style="fill:#000000;stroke-width:0"
+   inkscape:connector-curvature="0"
+   d="m 254.87,709.61 0,0.03 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 0,0.03 -0.01,0.02 -0.01,0.03 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.01,0.01 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.03,0.01 -0.02,0.02 -0.02,0.01 -0.02,0.01 -0.03,0.01 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.02,0.01 -0.03,0 -0.03,0 c -0.29,0 -0.53,-0.24 -0.53,-0.53 0,-0.29 0.24,-0.52 0.53,-0.52 0.29,0 0.53,0.23 0.53,0.52 z"
+   id="path4695-8" />
+</g>    <rect
+       y="412.32642"
+       x="24.653536"
+       height="78.076286"
+       width="146.41783"
+       id="rect2985-9"
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:0.46976614;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.43990937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
+       d="m 130.36039,491.05518 c 24.45164,27.09473 70.14646,10.06275 68.94564,-36.70102 -1.72091,-67.01849 -57.92236,-58.98056 -68.34438,-42.8469"
+       id="path3559-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csc" />
+    <g
+       id="content"
+       transform="matrix(1,0,0,-1,-192.85714,790.28571)"
+       xml:space="preserve"
+       stroke="black"
+       stroke-linecap="butt"
+       stroke-linejoin="miter"
+       stroke-miterlimit="10.433"
+       stroke-dasharray="none"
+       stroke-dashoffset="0"
+       stroke-opacity="1"
+       fill="none"
+       fill-rule="evenodd"
+       fill-opacity="1"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       text-anchor="start"
+       ns0:text="$L_1 \\left(I_1, \\cdots, I_{|I|}\\right)$"
+       ns0:preamble=""
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0">
+<path
+   d="M227.16,713.15 L227.17,713.18 L227.18,713.21 L227.18,713.24 L227.19,713.27 L227.2,713.3 L227.21,713.32 L227.22,713.35 L227.23,713.37 L227.24,713.39 L227.26,713.41 L227.27,713.43 L227.29,713.45 L227.3,713.47 L227.32,713.49 L227.35,713.5 L227.37,713.51 L227.4,713.53 L227.43,713.54 L227.46,713.55 L227.49,713.56 L227.51,713.57 L227.53,713.57 L227.55,713.57 L227.57,713.58 L227.6,713.58 L227.62,713.59 L227.64,713.59 L227.67,713.59 L227.7,713.59 L227.72,713.6 L227.75,713.6 L227.78,713.6 L227.81,713.6 L227.84,713.61 L227.87,713.61 L227.91,713.61 L227.94,713.61 L227.98,713.61 L228.01,713.61 L228.05,713.61 L228.09,713.61 L228.13,713.61 L228.17,713.61 L228.22,713.61 C228.52,713.61,228.6,713.61,228.6,713.8 C228.6,713.92,228.49,713.92,228.44,713.92 C228.11,713.92,227.29,713.89,226.96,713.89 C226.66,713.89,225.93,713.92,225.63,713.92 C225.57,713.92,225.45,713.92,225.45,713.72 C225.45,713.61,225.54,713.61,225.73,713.61 C225.74,713.61,225.93,713.61,226.1,713.59 C226.28,713.57,226.37,713.56,226.37,713.43 C226.37,713.4,226.36,713.36,226.33,713.25 L225,707.9 C224.9,707.51,224.88,707.43,224.09,707.43 C223.92,707.43,223.82,707.43,223.82,707.23 C223.82,707.12,223.91,707.12,224.09,707.12 H228.71 C228.95,707.12,228.95,707.12,229.01,707.29 L229.8,709.44 C229.84,709.55,229.84,709.57,229.84,709.58 C229.84,709.62,229.81,709.69,229.72,709.69 C229.63,709.69,229.62,709.64,229.55,709.48 C229.21,708.57,228.77,707.43,227.05,707.43 H226.11 C225.97,707.43,225.95,707.43,225.89,707.44 C225.79,707.45,225.76,707.46,225.76,707.54 C225.76,707.57,225.76,707.59,225.81,707.77 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3304" />
+<path
+   d="M232.54,710.05 L232.54,710.06 L232.54,710.07 L232.54,710.08 L232.54,710.09 L232.54,710.09 L232.54,710.1 L232.54,710.11 L232.54,710.12 L232.54,710.12 L232.54,710.13 L232.54,710.13 L232.54,710.14 L232.54,710.15 L232.54,710.15 L232.54,710.16 L232.54,710.16 L232.54,710.17 L232.54,710.17 L232.54,710.18 L232.53,710.19 L232.53,710.2 L232.53,710.2 L232.52,710.21 L232.52,710.22 L232.51,710.22 L232.51,710.23 L232.5,710.23 L232.5,710.23 L232.49,710.24 L232.48,710.24 L232.47,710.24 L232.46,710.24 L232.46,710.24 L232.45,710.24 L232.45,710.24 L232.44,710.25 L232.43,710.25 L232.43,710.25 L232.42,710.25 L232.41,710.25 L232.41,710.25 L232.4,710.25 L232.39,710.25 L232.39,710.25 L232.38,710.25 L232.37,710.25 L232.36,710.25 L232.35,710.25 L232.35,710.25 L232.34,710.25 C231.89,709.81,231.26,709.8,230.97,709.8 V709.55 C231.14,709.55,231.6,709.55,231.98,709.75 V706.2 C231.98,705.97,231.98,705.88,231.29,705.88 H231.02 V705.63 C231.15,705.64,232,705.66,232.26,705.66 C232.48,705.66,233.35,705.64,233.51,705.63 V705.88 H233.24 C232.54,705.88,232.54,705.97,232.54,706.2 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3306" />
+<path
+   d="M240.46,703.76 L240.46,703.76 L240.46,703.77 L240.46,703.77 L240.46,703.77 L240.46,703.78 L240.46,703.78 L240.46,703.78 L240.46,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.8 L240.45,703.8 L240.45,703.8 L240.45,703.81 L240.45,703.81 L240.44,703.81 L240.44,703.82 L240.44,703.82 L240.43,703.83 L240.43,703.83 L240.43,703.84 L240.42,703.84 L240.42,703.85 C239.96,704.34,239.28,705.14,238.86,706.77 C238.63,707.67,238.54,708.7,238.54,709.62 C238.54,712.24,239.17,714.07,240.37,715.36 C240.46,715.45,240.46,715.47,240.46,715.49 C240.46,715.59,240.38,715.59,240.34,715.59 C240.19,715.59,239.65,715,239.52,714.85 C238.51,713.64,237.86,711.85,237.86,709.63 C237.86,708.22,238.11,706.22,239.41,704.54 C239.51,704.42,240.16,703.66,240.34,703.66 C240.38,703.66,240.46,703.66,240.46,703.76 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3308" />
+<path
+   d="M244.64,713.16 L244.64,713.19 L244.65,713.22 L244.66,713.25 L244.67,713.28 L244.68,713.31 L244.69,713.33 L244.7,713.36 L244.71,713.38 L244.72,713.4 L244.73,713.42 L244.74,713.44 L244.76,713.46 L244.77,713.48 L244.79,713.49 L244.81,713.51 L244.83,713.52 L244.85,713.53 L244.88,713.54 L244.9,713.55 L244.93,713.56 L244.97,713.57 L244.98,713.58 L245,713.58 L245.02,713.58 L245.04,713.59 L245.06,713.59 L245.08,713.59 L245.1,713.6 L245.13,713.6 L245.15,713.6 L245.17,713.6 L245.2,713.6 L245.23,713.61 L245.25,713.61 L245.28,713.61 L245.31,713.61 L245.34,713.61 L245.37,713.61 L245.4,713.61 L245.44,713.61 L245.47,713.61 L245.51,713.61 L245.54,713.61 C245.78,713.61,245.86,713.61,245.86,713.8 C245.86,713.92,245.75,713.92,245.71,713.92 C245.42,713.92,244.69,713.89,244.4,713.89 C244.1,713.89,243.37,713.92,243.07,713.92 C243,713.92,242.87,713.92,242.87,713.72 C242.87,713.61,242.96,713.61,243.15,713.61 C243.57,713.61,243.84,713.61,243.84,713.42 C243.84,713.38,243.84,713.35,243.82,713.27 L242.47,707.9 C242.38,707.53,242.35,707.43,241.57,707.43 C241.34,707.43,241.25,707.43,241.25,707.23 C241.25,707.12,241.37,707.12,241.4,707.12 C241.69,707.12,242.41,707.16,242.7,707.16 C243,707.16,243.74,707.12,244.04,707.12 C244.12,707.12,244.24,707.12,244.24,707.31 C244.24,707.43,244.16,707.43,243.94,707.43 C243.76,707.43,243.71,707.43,243.51,707.45 C243.3,707.47,243.26,707.51,243.26,707.62 C243.26,707.7,243.28,707.78,243.3,707.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3310" />
+<path
+   d="M247.62,710.05 L247.62,710.06 L247.62,710.07 L247.62,710.08 L247.62,710.09 L247.62,710.09 L247.62,710.1 L247.62,710.11 L247.62,710.12 L247.62,710.12 L247.62,710.13 L247.62,710.13 L247.62,710.14 L247.62,710.15 L247.62,710.15 L247.62,710.16 L247.62,710.16 L247.61,710.17 L247.61,710.17 L247.61,710.18 L247.61,710.19 L247.61,710.2 L247.6,710.2 L247.6,710.21 L247.59,710.22 L247.59,710.22 L247.58,710.23 L247.58,710.23 L247.57,710.23 L247.56,710.24 L247.56,710.24 L247.55,710.24 L247.54,710.24 L247.53,710.24 L247.53,710.24 L247.52,710.24 L247.52,710.25 L247.51,710.25 L247.5,710.25 L247.5,710.25 L247.49,710.25 L247.48,710.25 L247.48,710.25 L247.47,710.25 L247.46,710.25 L247.45,710.25 L247.45,710.25 L247.44,710.25 L247.43,710.25 L247.42,710.25 L247.41,710.25 C246.97,709.81,246.33,709.8,246.05,709.8 V709.55 C246.21,709.55,246.67,709.55,247.06,709.75 V706.2 C247.06,705.97,247.06,705.88,246.36,705.88 H246.1 V705.63 C246.22,705.64,247.08,705.66,247.34,705.66 C247.55,705.66,248.43,705.64,248.58,705.63 V705.88 H248.32 C247.62,705.88,247.62,705.97,247.62,706.2 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3312" />
+<path
+   d="M251.78,707.14 L251.78,707.2 L251.78,707.26 L251.77,707.31 L251.77,707.37 L251.76,707.42 L251.76,707.48 L251.75,707.53 L251.74,707.58 L251.72,707.62 L251.71,707.67 L251.7,707.71 L251.68,707.75 L251.66,707.79 L251.65,707.83 L251.63,707.87 L251.61,707.9 L251.59,707.94 L251.56,707.97 L251.54,708 L251.52,708.02 L251.49,708.05 L251.46,708.07 L251.44,708.09 L251.41,708.11 L251.38,708.13 L251.35,708.14 L251.31,708.15 L251.28,708.16 L251.25,708.17 L251.21,708.18 L251.18,708.18 L251.14,708.18 C250.81,708.18,250.61,707.93,250.61,707.65 C250.61,707.38,250.81,707.12,251.14,707.12 C251.26,707.12,251.39,707.16,251.49,707.25 C251.52,707.27,251.53,707.28,251.54,707.28 C251.55,707.28,251.56,707.27,251.56,707.14 C251.56,706.4,251.21,705.8,250.88,705.47 C250.77,705.36,250.77,705.34,250.77,705.31 C250.77,705.24,250.82,705.2,250.87,705.2 C250.98,705.2,251.78,705.97,251.78,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3314" />
+<path
+   d="M256.1,709.61 L256.1,709.64 L256.1,709.67 L256.09,709.69 L256.09,709.72 L256.08,709.74 L256.08,709.77 L256.07,709.79 L256.06,709.82 L256.05,709.84 L256.03,709.86 L256.02,709.89 L256.01,709.91 L255.99,709.93 L255.98,709.95 L255.96,709.97 L255.94,709.99 L255.92,710 L255.91,710.02 L255.89,710.04 L255.87,710.05 L255.84,710.06 L255.82,710.08 L255.8,710.09 L255.78,710.1 L255.75,710.11 L255.73,710.12 L255.7,710.12 L255.68,710.13 L255.65,710.13 L255.62,710.14 L255.6,710.14 L255.57,710.14 C255.28,710.14,255.04,709.9,255.04,709.61 C255.04,709.32,255.28,709.09,255.57,709.09 C255.86,709.09,256.1,709.32,256.1,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3316" />
+<path
+   d="M260.53,709.61 L260.53,709.64 L260.53,709.67 L260.52,709.69 L260.52,709.72 L260.51,709.74 L260.51,709.77 L260.5,709.79 L260.49,709.82 L260.48,709.84 L260.47,709.86 L260.45,709.89 L260.44,709.91 L260.42,709.93 L260.41,709.95 L260.39,709.97 L260.37,709.99 L260.36,710 L260.34,710.02 L260.32,710.04 L260.3,710.05 L260.27,710.06 L260.25,710.08 L260.23,710.09 L260.21,710.1 L260.18,710.11 L260.16,710.12 L260.13,710.12 L260.11,710.13 L260.08,710.13 L260.06,710.14 L260.03,710.14 L260,710.14 C259.71,710.14,259.47,709.9,259.47,709.61 C259.47,709.32,259.71,709.09,260,709.09 C260.29,709.09,260.53,709.32,260.53,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3318" />
+<path
+   d="M264.95,709.61 L264.95,709.64 L264.95,709.67 L264.95,709.69 L264.94,709.72 L264.94,709.74 L264.93,709.77 L264.92,709.79 L264.91,709.82 L264.9,709.84 L264.89,709.86 L264.87,709.89 L264.86,709.91 L264.85,709.93 L264.83,709.95 L264.81,709.97 L264.8,709.99 L264.78,710 L264.76,710.02 L264.74,710.04 L264.72,710.05 L264.7,710.06 L264.67,710.08 L264.65,710.09 L264.63,710.1 L264.6,710.11 L264.58,710.12 L264.55,710.12 L264.53,710.13 L264.5,710.13 L264.48,710.14 L264.45,710.14 L264.42,710.14 C264.13,710.14,263.89,709.9,263.89,709.61 C263.89,709.32,264.13,709.09,264.42,709.09 C264.71,709.09,264.95,709.32,264.95,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3320" />
+<path
+   d="M269.49,707.14 L269.49,707.2 L269.49,707.26 L269.49,707.31 L269.48,707.37 L269.47,707.42 L269.47,707.48 L269.46,707.53 L269.45,707.58 L269.44,707.62 L269.42,707.67 L269.41,707.71 L269.39,707.75 L269.38,707.79 L269.36,707.83 L269.34,707.87 L269.32,707.9 L269.3,707.94 L269.27,707.97 L269.25,708 L269.23,708.02 L269.2,708.05 L269.17,708.07 L269.15,708.09 L269.12,708.11 L269.09,708.13 L269.06,708.14 L269.03,708.15 L268.99,708.16 L268.96,708.17 L268.93,708.18 L268.89,708.18 L268.85,708.18 C268.52,708.18,268.33,707.93,268.33,707.65 C268.33,707.38,268.52,707.12,268.85,707.12 C268.97,707.12,269.1,707.16,269.2,707.25 C269.23,707.27,269.24,707.28,269.25,707.28 C269.26,707.28,269.27,707.27,269.27,707.14 C269.27,706.4,268.92,705.8,268.59,705.47 C268.48,705.36,268.48,705.34,268.48,705.31 C268.48,705.24,268.54,705.2,268.58,705.2 C268.69,705.2,269.49,705.97,269.49,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3322" />
+<path
+   d="M275.63,713.16 L275.64,713.19 L275.64,713.22 L275.65,713.25 L275.66,713.28 L275.67,713.31 L275.68,713.33 L275.69,713.36 L275.7,713.38 L275.71,713.4 L275.72,713.42 L275.73,713.44 L275.75,713.46 L275.76,713.48 L275.78,713.49 L275.8,713.51 L275.82,713.52 L275.84,713.53 L275.87,713.54 L275.9,713.55 L275.93,713.56 L275.96,713.57 L275.98,713.58 L275.99,713.58 L276.01,713.58 L276.03,713.59 L276.05,713.59 L276.07,713.59 L276.1,713.6 L276.12,713.6 L276.14,713.6 L276.17,713.6 L276.19,713.6 L276.22,713.61 L276.25,713.61 L276.27,713.61 L276.3,713.61 L276.33,713.61 L276.36,713.61 L276.4,713.61 L276.43,713.61 L276.46,713.61 L276.5,713.61 L276.54,713.61 C276.77,713.61,276.85,713.61,276.85,713.8 C276.85,713.92,276.74,713.92,276.7,713.92 C276.42,713.92,275.68,713.89,275.39,713.89 C275.09,713.89,274.36,713.92,274.06,713.92 C273.99,713.92,273.86,713.92,273.86,713.72 C273.86,713.61,273.95,713.61,274.14,713.61 C274.56,713.61,274.83,713.61,274.83,713.42 C274.83,713.38,274.83,713.35,274.81,713.27 L273.46,707.9 C273.38,707.53,273.35,707.43,272.56,707.43 C272.33,707.43,272.24,707.43,272.24,707.23 C272.24,707.12,272.36,707.12,272.39,707.12 C272.68,707.12,273.4,707.16,273.69,707.16 C273.99,707.16,274.73,707.12,275.03,707.12 C275.11,707.12,275.23,707.12,275.23,707.31 C275.23,707.43,275.15,707.43,274.93,707.43 C274.75,707.43,274.7,707.43,274.5,707.45 C274.29,707.47,274.25,707.51,274.25,707.62 C274.25,707.7,274.27,707.78,274.29,707.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3324" />
+<path
+   d="M277.63,710.27 L277.63,710.28 L277.63,710.29 L277.63,710.3 L277.63,710.31 L277.62,710.33 L277.62,710.34 L277.62,710.36 L277.62,710.37 L277.62,710.38 L277.62,710.39 L277.62,710.4 L277.61,710.41 L277.61,710.42 L277.61,710.43 L277.61,710.44 L277.6,710.45 L277.6,710.46 L277.59,710.47 L277.59,710.48 L277.58,710.49 L277.57,710.5 L277.56,710.51 L277.56,710.51 L277.56,710.51 L277.55,710.52 L277.55,710.52 L277.54,710.52 L277.54,710.52 L277.53,710.53 L277.53,710.53 L277.52,710.53 L277.51,710.53 L277.51,710.54 L277.5,710.54 L277.5,710.54 L277.49,710.54 L277.48,710.54 L277.47,710.54 L277.47,710.54 L277.46,710.54 C277.29,710.54,277.29,710.38,277.29,710.27 V703.86 C277.29,703.76,277.29,703.59,277.45,703.59 C277.63,703.59,277.63,703.75,277.63,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3326" />
+<path
+   d="M281.52,709.53 L281.52,709.55 L281.53,709.57 L281.53,709.59 L281.54,709.61 L281.55,709.62 L281.55,709.64 L281.56,709.66 L281.56,709.67 L281.57,709.69 L281.58,709.7 L281.59,709.71 L281.6,709.72 L281.61,709.74 L281.62,709.75 L281.63,709.76 L281.65,709.76 L281.66,709.77 L281.68,709.78 L281.69,709.79 L281.71,709.79 L281.74,709.8 L281.75,709.8 L281.76,709.8 L281.77,709.81 L281.78,709.81 L281.8,709.81 L281.81,709.81 L281.83,709.81 L281.84,709.81 L281.86,709.82 L281.87,709.82 L281.89,709.82 L281.91,709.82 L281.93,709.82 L281.94,709.82 L281.96,709.82 L281.98,709.82 L282,709.82 L282.02,709.82 L282.05,709.82 L282.07,709.82 L282.09,709.82 L282.12,709.83 C282.29,709.83,282.38,709.83,282.38,709.97 C282.38,710.03,282.33,710.08,282.26,710.08 C282.12,710.08,281.94,710.05,281.8,710.05 C281.64,710.05,281.48,710.05,281.32,710.05 C281.32,710.05,280.84,710.05,280.84,710.05 C280.69,710.05,280.52,710.08,280.36,710.08 C280.32,710.08,280.22,710.08,280.22,709.92 C280.22,709.83,280.29,709.83,280.45,709.83 C280.45,709.83,280.59,709.83,280.71,709.81 C280.85,709.8,280.9,709.79,280.9,709.71 C280.9,709.67,280.88,709.62,280.87,709.57 L279.94,705.88 C279.89,705.65,279.87,705.58,279.35,705.58 C279.16,705.58,279.09,705.58,279.09,705.42 C279.09,705.42,279.09,705.33,279.2,705.33 C279.41,705.33,279.93,705.35,280.14,705.35 L280.62,705.35 C280.77,705.35,280.95,705.33,281.1,705.33 C281.14,705.33,281.25,705.33,281.25,705.48 C281.25,705.58,281.16,705.58,281.02,705.58 C281.01,705.58,280.86,705.58,280.72,705.59 C280.56,705.6,280.56,705.63,280.56,705.7 C280.56,705.7,280.56,705.74,280.59,705.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3328" />
+<path
+   d="M284.07,710.27 L284.07,710.28 L284.07,710.29 L284.07,710.3 L284.07,710.31 L284.06,710.33 L284.06,710.34 L284.06,710.36 L284.06,710.37 L284.06,710.38 L284.06,710.39 L284.06,710.4 L284.05,710.41 L284.05,710.42 L284.05,710.43 L284.05,710.44 L284.04,710.45 L284.04,710.46 L284.03,710.47 L284.03,710.48 L284.02,710.49 L284.01,710.5 L284,710.51 L284,710.51 L284,710.51 L283.99,710.52 L283.99,710.52 L283.98,710.52 L283.98,710.52 L283.97,710.53 L283.97,710.53 L283.96,710.53 L283.95,710.53 L283.95,710.54 L283.94,710.54 L283.94,710.54 L283.93,710.54 L283.92,710.54 L283.91,710.54 L283.91,710.54 L283.9,710.54 C283.73,710.54,283.73,710.38,283.73,710.27 V703.86 C283.73,703.76,283.73,703.59,283.89,703.59 C284.07,703.59,284.07,703.75,284.07,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3330" />
+<path
+   d="M288.62,709.62 L288.62,709.89 L288.61,710.18 L288.59,710.47 L288.56,710.78 L288.52,711.09 L288.47,711.41 L288.41,711.74 L288.33,712.07 L288.29,712.24 L288.24,712.4 L288.19,712.57 L288.13,712.74 L288.07,712.91 L288,713.07 L287.93,713.24 L287.86,713.41 L287.78,713.58 L287.69,713.74 L287.6,713.91 L287.51,714.07 L287.4,714.24 L287.3,714.4 L287.18,714.56 L287.06,714.72 C286.96,714.84,286.32,715.59,286.14,715.59 C286.09,715.59,286.02,715.57,286.02,715.49 C286.02,715.45,286.04,715.42,286.08,715.39 C286.56,714.88,287.2,714.07,287.61,712.49 C287.84,711.58,287.93,710.56,287.93,709.63 C287.93,708.63,287.84,707.61,287.58,706.64 C287.2,705.24,286.62,704.45,286.11,703.89 C286.02,703.8,286.02,703.78,286.02,703.76 C286.02,703.68,286.09,703.66,286.14,703.66 C286.29,703.66,286.83,704.27,286.95,704.41 C287.97,705.61,288.62,707.4,288.62,709.62 Z "
+   stroke-width="0"
+   fill="black"
+   id="path3332" />
+</g>    <g
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       ns0:preamble=""
+       ns0:text="$\\mathtt{jump}\\left(L_1, J_1, \\cdots, J_{|J|}\\right)$"
+       text-anchor="start"
+       word-spacing="normal"
+       letter-spacing="normal"
+       font-size-adjust="none"
+       font-stretch="normal"
+       font-weight="normal"
+       font-variant="normal"
+       font-style="normal"
+       fill-opacity="1"
+       fill-rule="evenodd"
+       fill="none"
+       stroke-opacity="1"
+       stroke-dashoffset="0"
+       stroke-dasharray="none"
+       stroke-miterlimit="10.433"
+       stroke-linejoin="miter"
+       stroke-linecap="butt"
+       stroke="black"
+       xml:space="preserve"
+       transform="matrix(1,0,0,-1,-194.64286,869.21428)"
+       id="g3652">
+<path
+   id="path3654"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,711.01 L227.1,711.03 L227.1,711.06 L227.1,711.09 L227.1,711.11 L227.09,711.14 L227.09,711.16 L227.09,711.18 L227.09,711.2 L227.08,711.22 L227.08,711.24 L227.07,711.25 L227.06,711.27 L227.06,711.29 L227.05,711.3 L227.04,711.31 L227.03,711.33 L227.02,711.34 L227,711.35 L226.99,711.36 L226.98,711.37 L226.96,711.37 L226.94,711.38 L226.93,711.39 L226.91,711.39 L226.89,711.4 L226.86,711.4 L226.84,711.41 L226.82,711.41 L226.79,711.41 L226.76,711.41 L226.73,711.41 L226.72,711.41 L226.7,711.41 H225.13 C224.97,711.41,224.72,711.41,224.72,711.11 C224.72,710.81,224.97,710.81,225.12,710.81 H226.41 V706.74 C226.41,706.57,226.41,706.19,226.15,705.84 C225.88,705.46,225.57,705.46,225.35,705.46 C225.06,705.46,224.94,705.48,224.79,705.5 C224.8,705.53,224.8,705.55,224.8,705.62 C224.8,705.9,224.57,706.07,224.36,706.07 C224.13,706.07,223.91,705.9,223.91,705.61 C223.91,704.86,224.89,704.86,225.3,704.86 C226.74,704.86,227.1,706.05,227.1,706.69 Z " />
+<path
+   id="path3656"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,712.72 L227.1,712.74 L227.1,712.77 L227.09,712.79 L227.09,712.82 L227.08,712.84 L227.08,712.87 L227.07,712.89 L227.06,712.91 L227.05,712.94 L227.04,712.96 L227.03,712.98 L227.02,713 L227,713.02 L226.99,713.04 L226.97,713.05 L226.96,713.07 L226.94,713.09 L226.92,713.1 L226.9,713.12 L226.88,713.13 L226.86,713.14 L226.84,713.16 L226.82,713.17 L226.8,713.18 L226.77,713.19 L226.75,713.19 L226.73,713.2 L226.7,713.21 L226.68,713.21 L226.65,713.21 L226.63,713.22 L226.6,713.22 C226.32,713.22,226.1,713,226.1,712.72 C226.1,712.44,226.32,712.22,226.6,712.22 C226.88,712.22,227.1,712.44,227.1,712.72 Z " />
+<path
+   id="path3658"
+   fill="black"
+   stroke-width="0"
+   d="M232.23,707.44 L232.23,707.43 L232.23,707.41 L232.23,707.4 L232.24,707.39 L232.24,707.37 L232.24,707.36 L232.24,707.35 L232.24,707.34 L232.25,707.33 L232.25,707.32 L232.25,707.31 L232.26,707.3 L232.26,707.29 L232.26,707.28 L232.27,707.27 L232.27,707.26 L232.28,707.25 L232.28,707.24 L232.29,707.24 L232.29,707.23 L232.3,707.21 L232.31,707.2 L232.33,707.19 L232.34,707.18 L232.35,707.17 L232.37,707.16 L232.38,707.16 L232.4,707.15 L232.41,707.15 L232.43,707.14 L232.44,707.14 L232.46,707.13 L232.48,707.13 L232.49,707.13 L232.51,707.13 L232.53,707.13 L232.56,707.13 L232.6,707.13 L232.63,707.12 H233.36 C233.52,707.12,233.77,707.12,233.77,707.43 C233.77,707.73,233.51,707.73,233.37,707.73 H232.92 V711.01 C232.92,711.32,232.86,711.41,232.52,711.41 H231.79 C231.63,711.41,231.38,711.41,231.38,711.11 C231.38,710.81,231.64,710.81,231.78,710.81 H232.23 V708.69 C232.23,707.79,231.42,707.67,231.1,707.67 C230.32,707.67,230.32,708,230.32,708.32 V711.01 C230.32,711.32,230.26,711.41,229.92,711.41 H229.19 C229.03,711.41,228.78,711.41,228.78,711.11 C228.78,710.81,229.04,710.81,229.18,710.81 H229.63 V708.26 C229.63,707.3,230.32,707.07,231.04,707.07 C231.45,707.07,231.86,707.16,232.23,707.44 Z " />
+<path
+   id="path3660"
+   fill="black"
+   stroke-width="0"
+   d="M234.98,711.12 L234.98,711.13 L234.98,711.14 L234.98,711.16 L234.97,711.17 L234.97,711.18 L234.97,711.19 L234.97,711.2 L234.96,711.21 L234.96,711.22 L234.96,711.24 L234.95,711.24 L234.95,711.25 L234.95,711.26 L234.94,711.27 L234.94,711.28 L234.93,711.29 L234.93,711.3 L234.92,711.3 L234.91,711.32 L234.9,711.33 L234.89,711.34 L234.88,711.35 L234.87,711.36 L234.85,711.37 L234.84,711.38 L234.83,711.38 L234.81,711.39 L234.8,711.39 L234.78,711.4 L234.76,711.4 L234.75,711.4 L234.73,711.41 L234.72,711.41 L234.7,711.41 L234.68,711.41 L234.65,711.41 L234.61,711.41 L234.58,711.41 H234.26 C234.11,711.41,233.85,711.41,233.85,711.12 C233.85,710.81,234.06,710.81,234.42,710.81 V707.73 C234.06,707.73,233.85,707.73,233.85,707.42 C233.85,707.12,234.12,707.12,234.26,707.12 H235.14 C235.29,707.12,235.55,707.12,235.55,707.42 C235.55,707.73,235.34,707.73,234.98,707.73 V709.51 C234.98,710.4,235.39,710.87,235.8,710.87 C236.03,710.87,236.16,710.7,236.16,710.05 V707.73 C235.98,707.73,235.73,707.73,235.73,707.42 C235.73,707.12,236,707.12,236.14,707.12 H236.88 C237.03,707.12,237.29,707.12,237.29,707.42 C237.29,707.73,237.08,707.73,236.72,707.73 V709.51 C236.72,710.4,237.13,710.87,237.54,710.87 C237.77,710.87,237.91,710.7,237.91,710.05 V707.73 C237.72,707.73,237.47,707.73,237.47,707.42 C237.47,707.12,237.74,707.12,237.88,707.12 H238.63 C238.78,707.12,239.04,707.12,239.04,707.42 C239.04,707.73,238.83,707.73,238.47,707.73 V710.14 C238.47,710.34,238.47,711.47,237.58,711.47 C237.28,711.47,236.87,711.34,236.59,710.96 C236.45,711.29,236.16,711.47,235.84,711.47 C235.52,711.47,235.22,711.34,234.98,711.12 Z " />
+<path
+   id="path3662"
+   fill="black"
+   stroke-width="0"
+   d="M240.78,707.57 L240.82,707.53 L240.85,707.5 L240.89,707.46 L240.93,707.43 L240.97,707.4 L241.01,707.37 L241.05,707.34 L241.09,707.32 L241.12,707.29 L241.16,707.27 L241.2,707.25 L241.24,707.23 L241.28,707.21 L241.31,707.19 L241.35,707.18 L241.39,707.16 L241.43,707.15 L241.46,707.14 L241.5,707.13 L241.54,707.12 L241.57,707.11 L241.61,707.1 L241.64,707.09 L241.68,707.09 L241.71,707.08 L241.74,707.08 L241.81,707.07 L241.87,707.07 L241.93,707.07 L241.9,707.67 C241.13,707.67,240.78,708.55,240.78,709.03 V709.75 C240.78,710.34,241.36,710.87,241.98,710.87 C242.72,710.87,243.3,710.14,243.3,709.28 C243.3,708.32,242.6,707.67,241.9,707.67 L241.93,707.07 C243.02,707.07,243.99,708.01,243.99,709.28 C243.99,710.5,243.1,711.47,242.04,711.47 C241.57,711.47,241.12,711.29,240.78,710.99 C240.78,711.28,240.76,711.41,240.38,711.41 H239.65 C239.49,711.41,239.24,711.41,239.24,711.11 C239.24,710.81,239.5,710.81,239.64,710.81 H240.09 V705.52 H239.65 C239.49,705.52,239.24,705.52,239.24,705.21 C239.24,704.92,239.5,704.92,239.64,704.92 H241.23 C241.37,704.92,241.62,704.92,241.62,705.21 C241.62,705.52,241.38,705.52,241.22,705.52 H240.78 Z " />
+<path
+   id="path3664"
+   fill="black"
+   stroke-width="0"
+   d="M250.13,703.76 L250.13,703.76 L250.13,703.77 L250.13,703.77 L250.13,703.77 L250.13,703.78 L250.13,703.78 L250.13,703.78 L250.13,703.79 L250.13,703.79 L250.13,703.79 L250.12,703.79 L250.12,703.8 L250.12,703.8 L250.12,703.8 L250.12,703.81 L250.12,703.81 L250.12,703.81 L250.11,703.82 L250.11,703.82 L250.11,703.83 L250.1,703.83 L250.1,703.84 L250.09,703.84 L250.09,703.85 C249.63,704.34,248.96,705.14,248.54,706.77 C248.31,707.67,248.22,708.7,248.22,709.62 C248.22,712.24,248.85,714.07,250.04,715.36 C250.13,715.45,250.13,715.47,250.13,715.49 C250.13,715.59,250.05,715.59,250.01,715.59 C249.86,715.59,249.32,715,249.19,714.85 C248.18,713.64,247.53,711.85,247.53,709.63 C247.53,708.22,247.78,706.22,249.08,704.54 C249.18,704.42,249.83,703.66,250.01,703.66 C250.05,703.66,250.13,703.66,250.13,703.76 Z " />
+<path
+   id="path3666"
+   fill="black"
+   stroke-width="0"
+   d="M254.31,713.15 L254.32,713.18 L254.32,713.21 L254.33,713.24 L254.34,713.27 L254.35,713.3 L254.36,713.32 L254.37,713.35 L254.38,713.37 L254.39,713.39 L254.4,713.41 L254.42,713.43 L254.43,713.45 L254.45,713.47 L254.47,713.49 L254.49,713.5 L254.52,713.51 L254.55,713.53 L254.58,713.54 L254.61,713.55 L254.64,713.56 L254.66,713.57 L254.68,713.57 L254.7,713.57 L254.72,713.58 L254.74,713.58 L254.77,713.59 L254.79,713.59 L254.82,713.59 L254.84,713.59 L254.87,713.6 L254.9,713.6 L254.93,713.6 L254.96,713.6 L254.99,713.61 L255.02,713.61 L255.05,713.61 L255.09,713.61 L255.12,713.61 L255.16,713.61 L255.2,713.61 L255.24,713.61 L255.28,713.61 L255.32,713.61 L255.37,713.61 C255.66,713.61,255.74,713.61,255.74,713.8 C255.74,713.92,255.63,713.92,255.58,713.92 C255.26,713.92,254.44,713.89,254.11,713.89 C253.81,713.89,253.08,713.92,252.78,713.92 C252.71,713.92,252.59,713.92,252.59,713.72 C252.59,713.61,252.68,713.61,252.87,713.61 C252.89,713.61,253.08,713.61,253.25,713.59 C253.43,713.57,253.52,713.56,253.52,713.43 C253.52,713.4,253.51,713.36,253.48,713.25 L252.15,707.9 C252.04,707.51,252.02,707.43,251.24,707.43 C251.07,707.43,250.97,707.43,250.97,707.23 C250.97,707.12,251.06,707.12,251.24,707.12 H255.85 C256.09,707.12,256.1,707.12,256.16,707.29 L256.95,709.44 C256.99,709.55,256.99,709.57,256.99,709.58 C256.99,709.62,256.96,709.69,256.87,709.69 C256.78,709.69,256.77,709.64,256.7,709.48 C256.36,708.57,255.92,707.43,254.2,707.43 H253.26 C253.12,707.43,253.1,707.43,253.04,707.44 C252.94,707.45,252.91,707.46,252.91,707.54 C252.91,707.57,252.91,707.59,252.96,707.77 Z " />
+<path
+   id="path3668"
+   fill="black"
+   stroke-width="0"
+   d="M259.69,710.05 L259.69,710.06 L259.69,710.07 L259.69,710.08 L259.69,710.09 L259.69,710.09 L259.69,710.1 L259.69,710.11 L259.69,710.12 L259.69,710.12 L259.69,710.13 L259.69,710.13 L259.69,710.14 L259.69,710.15 L259.69,710.15 L259.69,710.16 L259.69,710.16 L259.69,710.17 L259.69,710.17 L259.68,710.18 L259.68,710.19 L259.68,710.2 L259.67,710.2 L259.67,710.21 L259.67,710.22 L259.66,710.22 L259.66,710.23 L259.65,710.23 L259.64,710.23 L259.64,710.24 L259.63,710.24 L259.62,710.24 L259.61,710.24 L259.6,710.24 L259.6,710.24 L259.59,710.24 L259.59,710.25 L259.58,710.25 L259.58,710.25 L259.57,710.25 L259.56,710.25 L259.56,710.25 L259.55,710.25 L259.54,710.25 L259.53,710.25 L259.53,710.25 L259.52,710.25 L259.51,710.25 L259.5,710.25 L259.49,710.25 L259.48,710.25 C259.04,709.81,258.4,709.8,258.12,709.8 V709.55 C258.29,709.55,258.75,709.55,259.13,709.75 V706.2 C259.13,705.97,259.13,705.88,258.43,705.88 H258.17 V705.63 C258.29,705.64,259.15,705.66,259.41,705.66 C259.62,705.66,260.5,705.64,260.65,705.63 V705.88 H260.39 C259.69,705.88,259.69,705.97,259.69,706.2 Z " />
+<path
+   id="path3670"
+   fill="black"
+   stroke-width="0"
+   d="M263.85,707.14 L263.85,707.2 L263.85,707.26 L263.85,707.31 L263.84,707.37 L263.84,707.42 L263.83,707.48 L263.82,707.53 L263.81,707.58 L263.8,707.62 L263.78,707.67 L263.77,707.71 L263.75,707.75 L263.74,707.79 L263.72,707.83 L263.7,707.87 L263.68,707.9 L263.66,707.94 L263.64,707.97 L263.61,708 L263.59,708.02 L263.56,708.05 L263.54,708.07 L263.51,708.09 L263.48,708.11 L263.45,708.13 L263.42,708.14 L263.39,708.15 L263.35,708.16 L263.32,708.17 L263.29,708.18 L263.25,708.18 L263.22,708.18 C262.89,708.18,262.69,707.93,262.69,707.65 C262.69,707.38,262.89,707.12,263.22,707.12 C263.33,707.12,263.46,707.16,263.57,707.25 C263.59,707.27,263.6,707.28,263.61,707.28 C263.62,707.28,263.63,707.27,263.63,707.14 C263.63,706.4,263.29,705.8,262.96,705.47 C262.85,705.36,262.85,705.34,262.85,705.31 C262.85,705.24,262.9,705.2,262.95,705.2 C263.06,705.2,263.85,705.97,263.85,707.14 Z " />
+<path
+   id="path3672"
+   fill="black"
+   stroke-width="0"
+   d="M271.65,713.2 L271.66,713.23 L271.67,713.25 L271.68,713.28 L271.68,713.31 L271.69,713.33 L271.7,713.36 L271.7,713.38 L271.71,713.4 L271.72,713.42 L271.73,713.44 L271.74,713.46 L271.75,713.47 L271.76,713.49 L271.77,713.5 L271.79,713.52 L271.8,713.53 L271.82,713.54 L271.84,713.55 L271.86,713.56 L271.88,713.57 L271.9,713.58 L271.92,713.58 L271.95,713.59 L271.97,713.59 L271.98,713.59 L272,713.6 L272.01,713.6 L272.03,713.6 L272.05,713.6 L272.06,713.61 L272.08,713.61 L272.1,713.61 L272.12,713.61 L272.14,713.61 L272.16,713.61 L272.18,713.61 L272.21,713.61 L272.23,713.61 L272.25,713.61 L272.28,713.61 L272.3,713.61 C272.46,713.61,272.57,713.61,272.57,713.8 C272.57,713.89,272.51,713.92,272.43,713.92 C272.18,713.92,271.58,713.89,271.33,713.89 C271,713.89,270.19,713.92,269.86,713.92 C269.77,713.92,269.65,713.92,269.65,713.72 C269.65,713.61,269.73,713.61,269.99,713.61 C270.22,713.61,270.32,713.61,270.57,713.59 C270.81,713.56,270.88,713.53,270.88,713.4 C270.88,713.34,270.86,713.27,270.84,713.19 L269.69,708.62 C269.45,707.65,268.77,707.12,268.26,707.12 C268,707.12,267.47,707.22,267.31,707.74 C267.34,707.73,267.41,707.73,267.43,707.73 C267.82,707.73,268.08,708.07,268.08,708.37 C268.08,708.69,267.81,708.79,267.64,708.79 C267.46,708.79,266.97,708.67,266.97,707.99 C266.97,707.37,267.5,706.91,268.29,706.91 C269.2,706.91,270.24,707.56,270.49,708.55 Z " />
+<path
+   id="path3674"
+   fill="black"
+   stroke-width="0"
+   d="M274.11,710.05 L274.11,710.06 L274.11,710.07 L274.11,710.08 L274.11,710.09 L274.11,710.09 L274.11,710.1 L274.11,710.11 L274.11,710.12 L274.11,710.12 L274.11,710.13 L274.11,710.13 L274.11,710.14 L274.11,710.15 L274.11,710.15 L274.11,710.16 L274.11,710.16 L274.11,710.17 L274.11,710.17 L274.11,710.18 L274.1,710.19 L274.1,710.2 L274.1,710.2 L274.09,710.21 L274.09,710.22 L274.08,710.22 L274.08,710.23 L274.07,710.23 L274.07,710.23 L274.06,710.24 L274.05,710.24 L274.04,710.24 L274.03,710.24 L274.03,710.24 L274.02,710.24 L274.02,710.24 L274.01,710.25 L274,710.25 L274,710.25 L273.99,710.25 L273.98,710.25 L273.98,710.25 L273.97,710.25 L273.96,710.25 L273.96,710.25 L273.95,710.25 L273.94,710.25 L273.93,710.25 L273.92,710.25 L273.92,710.25 L273.91,710.25 C273.46,709.81,272.83,709.8,272.54,709.8 V709.55 C272.71,709.55,273.17,709.55,273.55,709.75 V706.2 C273.55,705.97,273.55,705.88,272.86,705.88 H272.59 V705.63 C272.71,705.64,273.57,705.66,273.83,705.66 C274.05,705.66,274.92,705.64,275.08,705.63 V705.88 H274.81 C274.11,705.88,274.11,705.97,274.11,706.2 Z " />
+<path
+   id="path3676"
+   fill="black"
+   stroke-width="0"
+   d="M278.27,707.14 L278.27,707.2 L278.27,707.26 L278.27,707.31 L278.26,707.37 L278.26,707.42 L278.25,707.48 L278.24,707.53 L278.23,707.58 L278.22,707.62 L278.21,707.67 L278.19,707.71 L278.18,707.75 L278.16,707.79 L278.14,707.83 L278.12,707.87 L278.1,707.9 L278.08,707.94 L278.06,707.97 L278.03,708 L278.01,708.02 L277.98,708.05 L277.96,708.07 L277.93,708.09 L277.9,708.11 L277.87,708.13 L277.84,708.14 L277.81,708.15 L277.78,708.16 L277.74,708.17 L277.71,708.18 L277.67,708.18 L277.64,708.18 C277.31,708.18,277.11,707.93,277.11,707.65 C277.11,707.38,277.31,707.12,277.64,707.12 C277.76,707.12,277.89,707.16,277.99,707.25 C278.02,707.27,278.02,707.28,278.04,707.28 C278.05,707.28,278.05,707.27,278.05,707.14 C278.05,706.4,277.71,705.8,277.38,705.47 C277.27,705.36,277.27,705.34,277.27,705.31 C277.27,705.24,277.32,705.2,277.37,705.2 C277.48,705.2,278.27,705.97,278.27,707.14 Z " />
+<path
+   id="path3678"
+   fill="black"
+   stroke-width="0"
+   d="M282.59,709.61 L282.59,709.64 L282.59,709.67 L282.59,709.69 L282.58,709.72 L282.58,709.74 L282.57,709.77 L282.56,709.79 L282.55,709.82 L282.54,709.84 L282.53,709.86 L282.52,709.89 L282.5,709.91 L282.49,709.93 L282.47,709.95 L282.45,709.97 L282.44,709.99 L282.42,710 L282.4,710.02 L282.38,710.04 L282.36,710.05 L282.34,710.06 L282.32,710.08 L282.29,710.09 L282.27,710.1 L282.25,710.11 L282.22,710.12 L282.2,710.12 L282.17,710.13 L282.14,710.13 L282.12,710.14 L282.09,710.14 L282.07,710.14 C281.78,710.14,281.54,709.9,281.54,709.61 C281.54,709.32,281.78,709.09,282.07,709.09 C282.35,709.09,282.59,709.32,282.59,709.61 Z " />
+<path
+   id="path3680"
+   fill="black"
+   stroke-width="0"
+   d="M287.02,709.61 L287.02,709.64 L287.02,709.67 L287.02,709.69 L287.01,709.72 L287.01,709.74 L287,709.77 L286.99,709.79 L286.98,709.82 L286.97,709.84 L286.96,709.86 L286.95,709.89 L286.93,709.91 L286.92,709.93 L286.9,709.95 L286.89,709.97 L286.87,709.99 L286.85,710 L286.83,710.02 L286.81,710.04 L286.79,710.05 L286.77,710.06 L286.75,710.08 L286.72,710.09 L286.7,710.1 L286.68,710.11 L286.65,710.12 L286.63,710.12 L286.6,710.13 L286.58,710.13 L286.55,710.14 L286.52,710.14 L286.5,710.14 C286.21,710.14,285.97,709.9,285.97,709.61 C285.97,709.32,286.21,709.09,286.5,709.09 C286.79,709.09,287.02,709.32,287.02,709.61 Z " />
+<path
+   id="path3682"
+   fill="black"
+   stroke-width="0"
+   d="M291.45,709.61 L291.45,709.64 L291.44,709.67 L291.44,709.69 L291.44,709.72 L291.43,709.74 L291.42,709.77 L291.41,709.79 L291.4,709.82 L291.39,709.84 L291.38,709.86 L291.37,709.89 L291.35,709.91 L291.34,709.93 L291.32,709.95 L291.31,709.97 L291.29,709.99 L291.27,710 L291.25,710.02 L291.23,710.04 L291.21,710.05 L291.19,710.06 L291.17,710.08 L291.14,710.09 L291.12,710.1 L291.1,710.11 L291.07,710.12 L291.05,710.12 L291.02,710.13 L291,710.13 L290.97,710.14 L290.94,710.14 L290.92,710.14 C290.63,710.14,290.39,709.9,290.39,709.61 C290.39,709.32,290.63,709.09,290.92,709.09 C291.21,709.09,291.45,709.32,291.45,709.61 Z " />
+<path
+   id="path3684"
+   fill="black"
+   stroke-width="0"
+   d="M295.99,707.14 L295.99,707.2 L295.98,707.26 L295.98,707.31 L295.97,707.37 L295.97,707.42 L295.96,707.48 L295.95,707.53 L295.94,707.58 L295.93,707.62 L295.92,707.67 L295.9,707.71 L295.89,707.75 L295.87,707.79 L295.85,707.83 L295.83,707.87 L295.81,707.9 L295.79,707.94 L295.77,707.97 L295.75,708 L295.72,708.02 L295.69,708.05 L295.67,708.07 L295.64,708.09 L295.61,708.11 L295.58,708.13 L295.55,708.14 L295.52,708.15 L295.49,708.16 L295.45,708.17 L295.42,708.18 L295.38,708.18 L295.35,708.18 C295.02,708.18,294.82,707.93,294.82,707.65 C294.82,707.38,295.02,707.12,295.35,707.12 C295.47,707.12,295.6,707.16,295.7,707.25 C295.73,707.27,295.74,707.28,295.75,707.28 C295.76,707.28,295.77,707.27,295.77,707.14 C295.77,706.4,295.42,705.8,295.09,705.47 C294.98,705.36,294.98,705.34,294.98,705.31 C294.98,705.24,295.03,705.2,295.08,705.2 C295.19,705.2,295.99,705.97,295.99,707.14 Z " />
+<path
+   id="path3686"
+   fill="black"
+   stroke-width="0"
+   d="M303.79,713.2 L303.79,713.23 L303.8,713.25 L303.81,713.28 L303.81,713.31 L303.82,713.33 L303.83,713.36 L303.84,713.38 L303.84,713.4 L303.85,713.42 L303.86,713.44 L303.87,713.46 L303.88,713.47 L303.89,713.49 L303.91,713.5 L303.92,713.52 L303.93,713.53 L303.95,713.54 L303.97,713.55 L303.99,713.56 L304.01,713.57 L304.03,713.58 L304.06,713.58 L304.08,713.59 L304.1,713.59 L304.11,713.59 L304.13,713.6 L304.14,713.6 L304.16,713.6 L304.18,713.6 L304.2,713.61 L304.21,713.61 L304.23,713.61 L304.25,713.61 L304.27,713.61 L304.29,713.61 L304.31,713.61 L304.34,713.61 L304.36,713.61 L304.38,713.61 L304.41,713.61 L304.43,713.61 C304.59,713.61,304.7,713.61,304.7,713.8 C304.7,713.89,304.64,713.92,304.56,713.92 C304.32,713.92,303.71,713.89,303.46,713.89 C303.13,713.89,302.32,713.92,301.99,713.92 C301.9,713.92,301.78,713.92,301.78,713.72 C301.78,713.61,301.86,713.61,302.12,713.61 C302.35,713.61,302.45,713.61,302.7,713.59 C302.94,713.56,303.01,713.53,303.01,713.4 C303.01,713.34,302.99,713.27,302.97,713.19 L301.82,708.62 C301.58,707.65,300.9,707.12,300.39,707.12 C300.13,707.12,299.6,707.22,299.44,707.74 C299.47,707.73,299.54,707.73,299.56,707.73 C299.95,707.73,300.21,708.07,300.21,708.37 C300.21,708.69,299.94,708.79,299.77,708.79 C299.59,708.79,299.1,708.67,299.1,707.99 C299.1,707.37,299.63,706.91,300.42,706.91 C301.33,706.91,302.37,707.56,302.62,708.55 Z " />
+<path
+   id="path3688"
+   fill="black"
+   stroke-width="0"
+   d="M305.27,710.27 L305.27,710.28 L305.27,710.29 L305.27,710.3 L305.27,710.31 L305.26,710.33 L305.26,710.34 L305.26,710.36 L305.26,710.37 L305.26,710.38 L305.26,710.39 L305.26,710.4 L305.25,710.41 L305.25,710.42 L305.25,710.43 L305.25,710.44 L305.24,710.45 L305.24,710.46 L305.23,710.47 L305.23,710.48 L305.22,710.49 L305.21,710.5 L305.2,710.51 L305.2,710.51 L305.2,710.51 L305.19,710.52 L305.19,710.52 L305.18,710.52 L305.18,710.52 L305.17,710.53 L305.17,710.53 L305.16,710.53 L305.15,710.53 L305.15,710.54 L305.14,710.54 L305.14,710.54 L305.13,710.54 L305.12,710.54 L305.11,710.54 L305.11,710.54 L305.1,710.54 C304.92,710.54,304.92,710.38,304.92,710.27 V703.86 C304.92,703.76,304.92,703.59,305.09,703.59 C305.27,703.59,305.27,703.75,305.27,703.86 Z " />
+<path
+   id="path3690"
+   fill="black"
+   stroke-width="0"
+   d="M310.44,709.54 L310.44,709.56 L310.45,709.58 L310.46,709.6 L310.46,709.62 L310.47,709.64 L310.47,709.66 L310.48,709.67 L310.48,709.69 L310.49,709.7 L310.49,709.71 L310.5,709.73 L310.51,709.74 L310.52,709.75 L310.53,709.76 L310.54,709.77 L310.55,709.77 L310.56,709.78 L310.57,709.79 L310.58,709.79 L310.6,709.8 L310.61,709.8 L310.63,709.81 L310.65,709.81 L310.66,709.81 L310.67,709.81 L310.68,709.82 L310.69,709.82 L310.7,709.82 L310.72,709.82 L310.73,709.82 L310.74,709.82 L310.75,709.82 L310.77,709.82 L310.78,709.82 L310.8,709.82 L310.81,709.82 L310.83,709.82 L310.85,709.82 L310.86,709.82 L310.88,709.82 L310.9,709.83 C310.98,709.83,311.08,709.83,311.08,709.97 C311.08,710.05,311.02,710.08,310.98,710.08 C310.81,710.08,310.39,710.05,310.22,710.05 C310.08,710.05,309.84,710.05,309.69,710.05 C309.51,710.06,309.31,710.08,309.14,710.08 C309.09,710.08,308.98,710.08,308.98,709.93 C308.98,709.83,309.05,709.83,309.26,709.83 C309.42,709.83,309.44,709.83,309.62,709.81 C309.82,709.79,309.84,709.77,309.84,709.69 C309.84,709.64,309.84,709.62,309.81,709.53 L309.01,706.34 C308.88,705.82,308.43,705.38,307.98,705.38 C307.88,705.38,307.44,705.4,307.28,705.74 C307.69,705.74,307.78,706.07,307.78,706.2 C307.78,706.39,307.61,706.49,307.46,706.49 C307.27,706.49,306.99,706.34,306.99,705.95 C306.99,705.5,307.42,705.19,308,705.19 C308.68,705.19,309.46,705.62,309.63,706.32 Z " />
+<path
+   id="path3692"
+   fill="black"
+   stroke-width="0"
+   d="M312.7,710.27 L312.7,710.28 L312.7,710.29 L312.7,710.3 L312.7,710.31 L312.7,710.33 L312.7,710.34 L312.7,710.36 L312.69,710.37 L312.69,710.38 L312.69,710.39 L312.69,710.4 L312.69,710.41 L312.68,710.42 L312.68,710.43 L312.68,710.44 L312.67,710.45 L312.67,710.46 L312.66,710.47 L312.66,710.48 L312.65,710.49 L312.64,710.5 L312.64,710.51 L312.63,710.51 L312.63,710.51 L312.62,710.52 L312.62,710.52 L312.61,710.52 L312.61,710.52 L312.6,710.53 L312.6,710.53 L312.59,710.53 L312.59,710.53 L312.58,710.54 L312.57,710.54 L312.57,710.54 L312.56,710.54 L312.55,710.54 L312.55,710.54 L312.54,710.54 L312.53,710.54 C312.36,710.54,312.36,710.38,312.36,710.27 V703.86 C312.36,703.76,312.36,703.59,312.52,703.59 C312.7,703.59,312.7,703.75,312.7,703.86 Z " />
+<path
+   id="path3694"
+   fill="black"
+   stroke-width="0"
+   d="M317.25,709.62 L317.25,709.89 L317.24,710.18 L317.22,710.47 L317.19,710.78 L317.15,711.09 L317.1,711.41 L317.04,711.74 L316.96,712.07 L316.92,712.24 L316.87,712.4 L316.82,712.57 L316.76,712.74 L316.7,712.91 L316.64,713.07 L316.57,713.24 L316.49,713.41 L316.41,713.58 L316.32,713.74 L316.23,713.91 L316.14,714.07 L316.04,714.24 L315.93,714.4 L315.82,714.56 L315.7,714.72 C315.6,714.84,314.95,715.59,314.77,715.59 C314.72,715.59,314.65,715.57,314.65,715.49 C314.65,715.45,314.67,715.42,314.71,715.39 C315.19,714.88,315.84,714.07,316.24,712.49 C316.47,711.58,316.56,710.56,316.56,709.63 C316.56,708.63,316.47,707.61,316.21,706.64 C315.84,705.24,315.25,704.45,314.74,703.89 C314.65,703.8,314.65,703.78,314.65,703.76 C314.65,703.68,314.72,703.66,314.77,703.66 C314.92,703.66,315.47,704.27,315.59,704.41 C316.6,705.61,317.25,707.4,317.25,709.62 Z " />
+</g>    <g
+       id="g4020"
+       transform="matrix(1,0,0,-1,-192.9308,981.7528)"
+       xml:space="preserve"
+       stroke="black"
+       stroke-linecap="butt"
+       stroke-linejoin="miter"
+       stroke-miterlimit="10.433"
+       stroke-dasharray="none"
+       stroke-dashoffset="0"
+       stroke-opacity="1"
+       fill="none"
+       fill-rule="evenodd"
+       fill-opacity="1"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       text-anchor="start"
+       ns0:text="$L_1 \\left(I_1, \\cdots, I_{|I|}\\right)$"
+       ns0:preamble=""
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0">
+<path
+   d="M227.16,713.15 L227.17,713.18 L227.18,713.21 L227.18,713.24 L227.19,713.27 L227.2,713.3 L227.21,713.32 L227.22,713.35 L227.23,713.37 L227.24,713.39 L227.26,713.41 L227.27,713.43 L227.29,713.45 L227.3,713.47 L227.32,713.49 L227.35,713.5 L227.37,713.51 L227.4,713.53 L227.43,713.54 L227.46,713.55 L227.49,713.56 L227.51,713.57 L227.53,713.57 L227.55,713.57 L227.57,713.58 L227.6,713.58 L227.62,713.59 L227.64,713.59 L227.67,713.59 L227.7,713.59 L227.72,713.6 L227.75,713.6 L227.78,713.6 L227.81,713.6 L227.84,713.61 L227.87,713.61 L227.91,713.61 L227.94,713.61 L227.98,713.61 L228.01,713.61 L228.05,713.61 L228.09,713.61 L228.13,713.61 L228.17,713.61 L228.22,713.61 C228.52,713.61,228.6,713.61,228.6,713.8 C228.6,713.92,228.49,713.92,228.44,713.92 C228.11,713.92,227.29,713.89,226.96,713.89 C226.66,713.89,225.93,713.92,225.63,713.92 C225.57,713.92,225.45,713.92,225.45,713.72 C225.45,713.61,225.54,713.61,225.73,713.61 C225.74,713.61,225.93,713.61,226.1,713.59 C226.28,713.57,226.37,713.56,226.37,713.43 C226.37,713.4,226.36,713.36,226.33,713.25 L225,707.9 C224.9,707.51,224.88,707.43,224.09,707.43 C223.92,707.43,223.82,707.43,223.82,707.23 C223.82,707.12,223.91,707.12,224.09,707.12 H228.71 C228.95,707.12,228.95,707.12,229.01,707.29 L229.8,709.44 C229.84,709.55,229.84,709.57,229.84,709.58 C229.84,709.62,229.81,709.69,229.72,709.69 C229.63,709.69,229.62,709.64,229.55,709.48 C229.21,708.57,228.77,707.43,227.05,707.43 H226.11 C225.97,707.43,225.95,707.43,225.89,707.44 C225.79,707.45,225.76,707.46,225.76,707.54 C225.76,707.57,225.76,707.59,225.81,707.77 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4022" />
+<path
+   d="M232.54,710.05 L232.54,710.06 L232.54,710.07 L232.54,710.08 L232.54,710.09 L232.54,710.09 L232.54,710.1 L232.54,710.11 L232.54,710.12 L232.54,710.12 L232.54,710.13 L232.54,710.13 L232.54,710.14 L232.54,710.15 L232.54,710.15 L232.54,710.16 L232.54,710.16 L232.54,710.17 L232.54,710.17 L232.54,710.18 L232.53,710.19 L232.53,710.2 L232.53,710.2 L232.52,710.21 L232.52,710.22 L232.51,710.22 L232.51,710.23 L232.5,710.23 L232.5,710.23 L232.49,710.24 L232.48,710.24 L232.47,710.24 L232.46,710.24 L232.46,710.24 L232.45,710.24 L232.45,710.24 L232.44,710.25 L232.43,710.25 L232.43,710.25 L232.42,710.25 L232.41,710.25 L232.41,710.25 L232.4,710.25 L232.39,710.25 L232.39,710.25 L232.38,710.25 L232.37,710.25 L232.36,710.25 L232.35,710.25 L232.35,710.25 L232.34,710.25 C231.89,709.81,231.26,709.8,230.97,709.8 V709.55 C231.14,709.55,231.6,709.55,231.98,709.75 V706.2 C231.98,705.97,231.98,705.88,231.29,705.88 H231.02 V705.63 C231.15,705.64,232,705.66,232.26,705.66 C232.48,705.66,233.35,705.64,233.51,705.63 V705.88 H233.24 C232.54,705.88,232.54,705.97,232.54,706.2 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4024" />
+<path
+   d="M240.46,703.76 L240.46,703.76 L240.46,703.77 L240.46,703.77 L240.46,703.77 L240.46,703.78 L240.46,703.78 L240.46,703.78 L240.46,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.8 L240.45,703.8 L240.45,703.8 L240.45,703.81 L240.45,703.81 L240.44,703.81 L240.44,703.82 L240.44,703.82 L240.43,703.83 L240.43,703.83 L240.43,703.84 L240.42,703.84 L240.42,703.85 C239.96,704.34,239.28,705.14,238.86,706.77 C238.63,707.67,238.54,708.7,238.54,709.62 C238.54,712.24,239.17,714.07,240.37,715.36 C240.46,715.45,240.46,715.47,240.46,715.49 C240.46,715.59,240.38,715.59,240.34,715.59 C240.19,715.59,239.65,715,239.52,714.85 C238.51,713.64,237.86,711.85,237.86,709.63 C237.86,708.22,238.11,706.22,239.41,704.54 C239.51,704.42,240.16,703.66,240.34,703.66 C240.38,703.66,240.46,703.66,240.46,703.76 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4026" />
+<path
+   d="M244.64,713.16 L244.64,713.19 L244.65,713.22 L244.66,713.25 L244.67,713.28 L244.68,713.31 L244.69,713.33 L244.7,713.36 L244.71,713.38 L244.72,713.4 L244.73,713.42 L244.74,713.44 L244.76,713.46 L244.77,713.48 L244.79,713.49 L244.81,713.51 L244.83,713.52 L244.85,713.53 L244.88,713.54 L244.9,713.55 L244.93,713.56 L244.97,713.57 L244.98,713.58 L245,713.58 L245.02,713.58 L245.04,713.59 L245.06,713.59 L245.08,713.59 L245.1,713.6 L245.13,713.6 L245.15,713.6 L245.17,713.6 L245.2,713.6 L245.23,713.61 L245.25,713.61 L245.28,713.61 L245.31,713.61 L245.34,713.61 L245.37,713.61 L245.4,713.61 L245.44,713.61 L245.47,713.61 L245.51,713.61 L245.54,713.61 C245.78,713.61,245.86,713.61,245.86,713.8 C245.86,713.92,245.75,713.92,245.71,713.92 C245.42,713.92,244.69,713.89,244.4,713.89 C244.1,713.89,243.37,713.92,243.07,713.92 C243,713.92,242.87,713.92,242.87,713.72 C242.87,713.61,242.96,713.61,243.15,713.61 C243.57,713.61,243.84,713.61,243.84,713.42 C243.84,713.38,243.84,713.35,243.82,713.27 L242.47,707.9 C242.38,707.53,242.35,707.43,241.57,707.43 C241.34,707.43,241.25,707.43,241.25,707.23 C241.25,707.12,241.37,707.12,241.4,707.12 C241.69,707.12,242.41,707.16,242.7,707.16 C243,707.16,243.74,707.12,244.04,707.12 C244.12,707.12,244.24,707.12,244.24,707.31 C244.24,707.43,244.16,707.43,243.94,707.43 C243.76,707.43,243.71,707.43,243.51,707.45 C243.3,707.47,243.26,707.51,243.26,707.62 C243.26,707.7,243.28,707.78,243.3,707.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4028" />
+<path
+   d="M247.62,710.05 L247.62,710.06 L247.62,710.07 L247.62,710.08 L247.62,710.09 L247.62,710.09 L247.62,710.1 L247.62,710.11 L247.62,710.12 L247.62,710.12 L247.62,710.13 L247.62,710.13 L247.62,710.14 L247.62,710.15 L247.62,710.15 L247.62,710.16 L247.62,710.16 L247.61,710.17 L247.61,710.17 L247.61,710.18 L247.61,710.19 L247.61,710.2 L247.6,710.2 L247.6,710.21 L247.59,710.22 L247.59,710.22 L247.58,710.23 L247.58,710.23 L247.57,710.23 L247.56,710.24 L247.56,710.24 L247.55,710.24 L247.54,710.24 L247.53,710.24 L247.53,710.24 L247.52,710.24 L247.52,710.25 L247.51,710.25 L247.5,710.25 L247.5,710.25 L247.49,710.25 L247.48,710.25 L247.48,710.25 L247.47,710.25 L247.46,710.25 L247.45,710.25 L247.45,710.25 L247.44,710.25 L247.43,710.25 L247.42,710.25 L247.41,710.25 C246.97,709.81,246.33,709.8,246.05,709.8 V709.55 C246.21,709.55,246.67,709.55,247.06,709.75 V706.2 C247.06,705.97,247.06,705.88,246.36,705.88 H246.1 V705.63 C246.22,705.64,247.08,705.66,247.34,705.66 C247.55,705.66,248.43,705.64,248.58,705.63 V705.88 H248.32 C247.62,705.88,247.62,705.97,247.62,706.2 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4030" />
+<path
+   d="M251.78,707.14 L251.78,707.2 L251.78,707.26 L251.77,707.31 L251.77,707.37 L251.76,707.42 L251.76,707.48 L251.75,707.53 L251.74,707.58 L251.72,707.62 L251.71,707.67 L251.7,707.71 L251.68,707.75 L251.66,707.79 L251.65,707.83 L251.63,707.87 L251.61,707.9 L251.59,707.94 L251.56,707.97 L251.54,708 L251.52,708.02 L251.49,708.05 L251.46,708.07 L251.44,708.09 L251.41,708.11 L251.38,708.13 L251.35,708.14 L251.31,708.15 L251.28,708.16 L251.25,708.17 L251.21,708.18 L251.18,708.18 L251.14,708.18 C250.81,708.18,250.61,707.93,250.61,707.65 C250.61,707.38,250.81,707.12,251.14,707.12 C251.26,707.12,251.39,707.16,251.49,707.25 C251.52,707.27,251.53,707.28,251.54,707.28 C251.55,707.28,251.56,707.27,251.56,707.14 C251.56,706.4,251.21,705.8,250.88,705.47 C250.77,705.36,250.77,705.34,250.77,705.31 C250.77,705.24,250.82,705.2,250.87,705.2 C250.98,705.2,251.78,705.97,251.78,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4032" />
+<path
+   d="M256.1,709.61 L256.1,709.64 L256.1,709.67 L256.09,709.69 L256.09,709.72 L256.08,709.74 L256.08,709.77 L256.07,709.79 L256.06,709.82 L256.05,709.84 L256.03,709.86 L256.02,709.89 L256.01,709.91 L255.99,709.93 L255.98,709.95 L255.96,709.97 L255.94,709.99 L255.92,710 L255.91,710.02 L255.89,710.04 L255.87,710.05 L255.84,710.06 L255.82,710.08 L255.8,710.09 L255.78,710.1 L255.75,710.11 L255.73,710.12 L255.7,710.12 L255.68,710.13 L255.65,710.13 L255.62,710.14 L255.6,710.14 L255.57,710.14 C255.28,710.14,255.04,709.9,255.04,709.61 C255.04,709.32,255.28,709.09,255.57,709.09 C255.86,709.09,256.1,709.32,256.1,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4034" />
+<path
+   d="M260.53,709.61 L260.53,709.64 L260.53,709.67 L260.52,709.69 L260.52,709.72 L260.51,709.74 L260.51,709.77 L260.5,709.79 L260.49,709.82 L260.48,709.84 L260.47,709.86 L260.45,709.89 L260.44,709.91 L260.42,709.93 L260.41,709.95 L260.39,709.97 L260.37,709.99 L260.36,710 L260.34,710.02 L260.32,710.04 L260.3,710.05 L260.27,710.06 L260.25,710.08 L260.23,710.09 L260.21,710.1 L260.18,710.11 L260.16,710.12 L260.13,710.12 L260.11,710.13 L260.08,710.13 L260.06,710.14 L260.03,710.14 L260,710.14 C259.71,710.14,259.47,709.9,259.47,709.61 C259.47,709.32,259.71,709.09,260,709.09 C260.29,709.09,260.53,709.32,260.53,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4036" />
+<path
+   d="M264.95,709.61 L264.95,709.64 L264.95,709.67 L264.95,709.69 L264.94,709.72 L264.94,709.74 L264.93,709.77 L264.92,709.79 L264.91,709.82 L264.9,709.84 L264.89,709.86 L264.87,709.89 L264.86,709.91 L264.85,709.93 L264.83,709.95 L264.81,709.97 L264.8,709.99 L264.78,710 L264.76,710.02 L264.74,710.04 L264.72,710.05 L264.7,710.06 L264.67,710.08 L264.65,710.09 L264.63,710.1 L264.6,710.11 L264.58,710.12 L264.55,710.12 L264.53,710.13 L264.5,710.13 L264.48,710.14 L264.45,710.14 L264.42,710.14 C264.13,710.14,263.89,709.9,263.89,709.61 C263.89,709.32,264.13,709.09,264.42,709.09 C264.71,709.09,264.95,709.32,264.95,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4038" />
+<path
+   d="M269.49,707.14 L269.49,707.2 L269.49,707.26 L269.49,707.31 L269.48,707.37 L269.47,707.42 L269.47,707.48 L269.46,707.53 L269.45,707.58 L269.44,707.62 L269.42,707.67 L269.41,707.71 L269.39,707.75 L269.38,707.79 L269.36,707.83 L269.34,707.87 L269.32,707.9 L269.3,707.94 L269.27,707.97 L269.25,708 L269.23,708.02 L269.2,708.05 L269.17,708.07 L269.15,708.09 L269.12,708.11 L269.09,708.13 L269.06,708.14 L269.03,708.15 L268.99,708.16 L268.96,708.17 L268.93,708.18 L268.89,708.18 L268.85,708.18 C268.52,708.18,268.33,707.93,268.33,707.65 C268.33,707.38,268.52,707.12,268.85,707.12 C268.97,707.12,269.1,707.16,269.2,707.25 C269.23,707.27,269.24,707.28,269.25,707.28 C269.26,707.28,269.27,707.27,269.27,707.14 C269.27,706.4,268.92,705.8,268.59,705.47 C268.48,705.36,268.48,705.34,268.48,705.31 C268.48,705.24,268.54,705.2,268.58,705.2 C268.69,705.2,269.49,705.97,269.49,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4040" />
+<path
+   d="M275.63,713.16 L275.64,713.19 L275.64,713.22 L275.65,713.25 L275.66,713.28 L275.67,713.31 L275.68,713.33 L275.69,713.36 L275.7,713.38 L275.71,713.4 L275.72,713.42 L275.73,713.44 L275.75,713.46 L275.76,713.48 L275.78,713.49 L275.8,713.51 L275.82,713.52 L275.84,713.53 L275.87,713.54 L275.9,713.55 L275.93,713.56 L275.96,713.57 L275.98,713.58 L275.99,713.58 L276.01,713.58 L276.03,713.59 L276.05,713.59 L276.07,713.59 L276.1,713.6 L276.12,713.6 L276.14,713.6 L276.17,713.6 L276.19,713.6 L276.22,713.61 L276.25,713.61 L276.27,713.61 L276.3,713.61 L276.33,713.61 L276.36,713.61 L276.4,713.61 L276.43,713.61 L276.46,713.61 L276.5,713.61 L276.54,713.61 C276.77,713.61,276.85,713.61,276.85,713.8 C276.85,713.92,276.74,713.92,276.7,713.92 C276.42,713.92,275.68,713.89,275.39,713.89 C275.09,713.89,274.36,713.92,274.06,713.92 C273.99,713.92,273.86,713.92,273.86,713.72 C273.86,713.61,273.95,713.61,274.14,713.61 C274.56,713.61,274.83,713.61,274.83,713.42 C274.83,713.38,274.83,713.35,274.81,713.27 L273.46,707.9 C273.38,707.53,273.35,707.43,272.56,707.43 C272.33,707.43,272.24,707.43,272.24,707.23 C272.24,707.12,272.36,707.12,272.39,707.12 C272.68,707.12,273.4,707.16,273.69,707.16 C273.99,707.16,274.73,707.12,275.03,707.12 C275.11,707.12,275.23,707.12,275.23,707.31 C275.23,707.43,275.15,707.43,274.93,707.43 C274.75,707.43,274.7,707.43,274.5,707.45 C274.29,707.47,274.25,707.51,274.25,707.62 C274.25,707.7,274.27,707.78,274.29,707.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4042" />
+<path
+   d="M277.63,710.27 L277.63,710.28 L277.63,710.29 L277.63,710.3 L277.63,710.31 L277.62,710.33 L277.62,710.34 L277.62,710.36 L277.62,710.37 L277.62,710.38 L277.62,710.39 L277.62,710.4 L277.61,710.41 L277.61,710.42 L277.61,710.43 L277.61,710.44 L277.6,710.45 L277.6,710.46 L277.59,710.47 L277.59,710.48 L277.58,710.49 L277.57,710.5 L277.56,710.51 L277.56,710.51 L277.56,710.51 L277.55,710.52 L277.55,710.52 L277.54,710.52 L277.54,710.52 L277.53,710.53 L277.53,710.53 L277.52,710.53 L277.51,710.53 L277.51,710.54 L277.5,710.54 L277.5,710.54 L277.49,710.54 L277.48,710.54 L277.47,710.54 L277.47,710.54 L277.46,710.54 C277.29,710.54,277.29,710.38,277.29,710.27 V703.86 C277.29,703.76,277.29,703.59,277.45,703.59 C277.63,703.59,277.63,703.75,277.63,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4044" />
+<path
+   d="M281.52,709.53 L281.52,709.55 L281.53,709.57 L281.53,709.59 L281.54,709.61 L281.55,709.62 L281.55,709.64 L281.56,709.66 L281.56,709.67 L281.57,709.69 L281.58,709.7 L281.59,709.71 L281.6,709.72 L281.61,709.74 L281.62,709.75 L281.63,709.76 L281.65,709.76 L281.66,709.77 L281.68,709.78 L281.69,709.79 L281.71,709.79 L281.74,709.8 L281.75,709.8 L281.76,709.8 L281.77,709.81 L281.78,709.81 L281.8,709.81 L281.81,709.81 L281.83,709.81 L281.84,709.81 L281.86,709.82 L281.87,709.82 L281.89,709.82 L281.91,709.82 L281.93,709.82 L281.94,709.82 L281.96,709.82 L281.98,709.82 L282,709.82 L282.02,709.82 L282.05,709.82 L282.07,709.82 L282.09,709.82 L282.12,709.83 C282.29,709.83,282.38,709.83,282.38,709.97 C282.38,710.03,282.33,710.08,282.26,710.08 C282.12,710.08,281.94,710.05,281.8,710.05 C281.64,710.05,281.48,710.05,281.32,710.05 C281.32,710.05,280.84,710.05,280.84,710.05 C280.69,710.05,280.52,710.08,280.36,710.08 C280.32,710.08,280.22,710.08,280.22,709.92 C280.22,709.83,280.29,709.83,280.45,709.83 C280.45,709.83,280.59,709.83,280.71,709.81 C280.85,709.8,280.9,709.79,280.9,709.71 C280.9,709.67,280.88,709.62,280.87,709.57 L279.94,705.88 C279.89,705.65,279.87,705.58,279.35,705.58 C279.16,705.58,279.09,705.58,279.09,705.42 C279.09,705.42,279.09,705.33,279.2,705.33 C279.41,705.33,279.93,705.35,280.14,705.35 L280.62,705.35 C280.77,705.35,280.95,705.33,281.1,705.33 C281.14,705.33,281.25,705.33,281.25,705.48 C281.25,705.58,281.16,705.58,281.02,705.58 C281.01,705.58,280.86,705.58,280.72,705.59 C280.56,705.6,280.56,705.63,280.56,705.7 C280.56,705.7,280.56,705.74,280.59,705.85 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4046" />
+<path
+   d="M284.07,710.27 L284.07,710.28 L284.07,710.29 L284.07,710.3 L284.07,710.31 L284.06,710.33 L284.06,710.34 L284.06,710.36 L284.06,710.37 L284.06,710.38 L284.06,710.39 L284.06,710.4 L284.05,710.41 L284.05,710.42 L284.05,710.43 L284.05,710.44 L284.04,710.45 L284.04,710.46 L284.03,710.47 L284.03,710.48 L284.02,710.49 L284.01,710.5 L284,710.51 L284,710.51 L284,710.51 L283.99,710.52 L283.99,710.52 L283.98,710.52 L283.98,710.52 L283.97,710.53 L283.97,710.53 L283.96,710.53 L283.95,710.53 L283.95,710.54 L283.94,710.54 L283.94,710.54 L283.93,710.54 L283.92,710.54 L283.91,710.54 L283.91,710.54 L283.9,710.54 C283.73,710.54,283.73,710.38,283.73,710.27 V703.86 C283.73,703.76,283.73,703.59,283.89,703.59 C284.07,703.59,284.07,703.75,284.07,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4048" />
+<path
+   d="M288.62,709.62 L288.62,709.89 L288.61,710.18 L288.59,710.47 L288.56,710.78 L288.52,711.09 L288.47,711.41 L288.41,711.74 L288.33,712.07 L288.29,712.24 L288.24,712.4 L288.19,712.57 L288.13,712.74 L288.07,712.91 L288,713.07 L287.93,713.24 L287.86,713.41 L287.78,713.58 L287.69,713.74 L287.6,713.91 L287.51,714.07 L287.4,714.24 L287.3,714.4 L287.18,714.56 L287.06,714.72 C286.96,714.84,286.32,715.59,286.14,715.59 C286.09,715.59,286.02,715.57,286.02,715.49 C286.02,715.45,286.04,715.42,286.08,715.39 C286.56,714.88,287.2,714.07,287.61,712.49 C287.84,711.58,287.93,710.56,287.93,709.63 C287.93,708.63,287.84,707.61,287.58,706.64 C287.2,705.24,286.62,704.45,286.11,703.89 C286.02,703.8,286.02,703.78,286.02,703.76 C286.02,703.68,286.09,703.66,286.14,703.66 C286.29,703.66,286.83,704.27,286.95,704.41 C287.97,705.61,288.62,707.4,288.62,709.62 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4050" />
+</g>    <g
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       ns0:preamble=""
+       ns0:text="$\\mathtt{jump}\\left(L_2, J_1, \\cdots, J_{|J|}\\right)$"
+       text-anchor="start"
+       word-spacing="normal"
+       letter-spacing="normal"
+       font-size-adjust="none"
+       font-stretch="normal"
+       font-weight="normal"
+       font-variant="normal"
+       font-style="normal"
+       fill-opacity="1"
+       fill-rule="evenodd"
+       fill="none"
+       stroke-opacity="1"
+       stroke-dashoffset="0"
+       stroke-dasharray="none"
+       stroke-miterlimit="10.433"
+       stroke-linejoin="miter"
+       stroke-linecap="butt"
+       stroke="black"
+       xml:space="preserve"
+       transform="matrix(1,0,0,-1,-194.71652,1060.6814)"
+       id="g4370">
+<path
+   id="path4372"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,711.01 L227.1,711.03 L227.1,711.06 L227.1,711.09 L227.1,711.11 L227.09,711.14 L227.09,711.16 L227.09,711.18 L227.09,711.2 L227.08,711.22 L227.08,711.24 L227.07,711.25 L227.06,711.27 L227.06,711.29 L227.05,711.3 L227.04,711.31 L227.03,711.33 L227.02,711.34 L227,711.35 L226.99,711.36 L226.98,711.37 L226.96,711.37 L226.94,711.38 L226.93,711.39 L226.91,711.39 L226.89,711.4 L226.86,711.4 L226.84,711.41 L226.82,711.41 L226.79,711.41 L226.76,711.41 L226.73,711.41 L226.72,711.41 L226.7,711.41 H225.13 C224.97,711.41,224.72,711.41,224.72,711.11 C224.72,710.81,224.97,710.81,225.12,710.81 H226.41 V706.74 C226.41,706.57,226.41,706.19,226.15,705.84 C225.88,705.46,225.57,705.46,225.35,705.46 C225.06,705.46,224.94,705.48,224.79,705.5 C224.8,705.53,224.8,705.55,224.8,705.62 C224.8,705.9,224.57,706.07,224.36,706.07 C224.13,706.07,223.91,705.9,223.91,705.61 C223.91,704.86,224.89,704.86,225.3,704.86 C226.74,704.86,227.1,706.05,227.1,706.69 Z " />
+<path
+   id="path4374"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,712.72 L227.1,712.74 L227.1,712.77 L227.09,712.79 L227.09,712.82 L227.08,712.84 L227.08,712.87 L227.07,712.89 L227.06,712.91 L227.05,712.94 L227.04,712.96 L227.03,712.98 L227.02,713 L227,713.02 L226.99,713.04 L226.97,713.05 L226.96,713.07 L226.94,713.09 L226.92,713.1 L226.9,713.12 L226.88,713.13 L226.86,713.14 L226.84,713.16 L226.82,713.17 L226.8,713.18 L226.77,713.19 L226.75,713.19 L226.73,713.2 L226.7,713.21 L226.68,713.21 L226.65,713.21 L226.63,713.22 L226.6,713.22 C226.32,713.22,226.1,713,226.1,712.72 C226.1,712.44,226.32,712.22,226.6,712.22 C226.88,712.22,227.1,712.44,227.1,712.72 Z " />
+<path
+   id="path4376"
+   fill="black"
+   stroke-width="0"
+   d="M232.23,707.44 L232.23,707.43 L232.23,707.41 L232.23,707.4 L232.24,707.39 L232.24,707.37 L232.24,707.36 L232.24,707.35 L232.24,707.34 L232.25,707.33 L232.25,707.32 L232.25,707.31 L232.26,707.3 L232.26,707.29 L232.26,707.28 L232.27,707.27 L232.27,707.26 L232.28,707.25 L232.28,707.24 L232.29,707.24 L232.29,707.23 L232.3,707.21 L232.31,707.2 L232.33,707.19 L232.34,707.18 L232.35,707.17 L232.37,707.16 L232.38,707.16 L232.4,707.15 L232.41,707.15 L232.43,707.14 L232.44,707.14 L232.46,707.13 L232.48,707.13 L232.49,707.13 L232.51,707.13 L232.53,707.13 L232.56,707.13 L232.6,707.13 L232.63,707.12 H233.36 C233.52,707.12,233.77,707.12,233.77,707.43 C233.77,707.73,233.51,707.73,233.37,707.73 H232.92 V711.01 C232.92,711.32,232.86,711.41,232.52,711.41 H231.79 C231.63,711.41,231.38,711.41,231.38,711.11 C231.38,710.81,231.64,710.81,231.78,710.81 H232.23 V708.69 C232.23,707.79,231.42,707.67,231.1,707.67 C230.32,707.67,230.32,708,230.32,708.32 V711.01 C230.32,711.32,230.26,711.41,229.92,711.41 H229.19 C229.03,711.41,228.78,711.41,228.78,711.11 C228.78,710.81,229.04,710.81,229.18,710.81 H229.63 V708.26 C229.63,707.3,230.32,707.07,231.04,707.07 C231.45,707.07,231.86,707.16,232.23,707.44 Z " />
+<path
+   id="path4378"
+   fill="black"
+   stroke-width="0"
+   d="M234.98,711.12 L234.98,711.13 L234.98,711.14 L234.98,711.16 L234.97,711.17 L234.97,711.18 L234.97,711.19 L234.97,711.2 L234.96,711.21 L234.96,711.22 L234.96,711.24 L234.95,711.24 L234.95,711.25 L234.95,711.26 L234.94,711.27 L234.94,711.28 L234.93,711.29 L234.93,711.3 L234.92,711.3 L234.91,711.32 L234.9,711.33 L234.89,711.34 L234.88,711.35 L234.87,711.36 L234.85,711.37 L234.84,711.38 L234.83,711.38 L234.81,711.39 L234.8,711.39 L234.78,711.4 L234.76,711.4 L234.75,711.4 L234.73,711.41 L234.72,711.41 L234.7,711.41 L234.68,711.41 L234.65,711.41 L234.61,711.41 L234.58,711.41 H234.26 C234.11,711.41,233.85,711.41,233.85,711.12 C233.85,710.81,234.06,710.81,234.42,710.81 V707.73 C234.06,707.73,233.85,707.73,233.85,707.42 C233.85,707.12,234.12,707.12,234.26,707.12 H235.14 C235.29,707.12,235.55,707.12,235.55,707.42 C235.55,707.73,235.34,707.73,234.98,707.73 V709.51 C234.98,710.4,235.39,710.87,235.8,710.87 C236.03,710.87,236.16,710.7,236.16,710.05 V707.73 C235.98,707.73,235.73,707.73,235.73,707.42 C235.73,707.12,236,707.12,236.14,707.12 H236.88 C237.03,707.12,237.29,707.12,237.29,707.42 C237.29,707.73,237.08,707.73,236.72,707.73 V709.51 C236.72,710.4,237.13,710.87,237.54,710.87 C237.77,710.87,237.91,710.7,237.91,710.05 V707.73 C237.72,707.73,237.47,707.73,237.47,707.42 C237.47,707.12,237.74,707.12,237.88,707.12 H238.63 C238.78,707.12,239.04,707.12,239.04,707.42 C239.04,707.73,238.83,707.73,238.47,707.73 V710.14 C238.47,710.34,238.47,711.47,237.58,711.47 C237.28,711.47,236.87,711.34,236.59,710.96 C236.45,711.29,236.16,711.47,235.84,711.47 C235.52,711.47,235.22,711.34,234.98,711.12 Z " />
+<path
+   id="path4380"
+   fill="black"
+   stroke-width="0"
+   d="M240.78,707.57 L240.82,707.53 L240.85,707.5 L240.89,707.46 L240.93,707.43 L240.97,707.4 L241.01,707.37 L241.05,707.34 L241.09,707.32 L241.12,707.29 L241.16,707.27 L241.2,707.25 L241.24,707.23 L241.28,707.21 L241.31,707.19 L241.35,707.18 L241.39,707.16 L241.43,707.15 L241.46,707.14 L241.5,707.13 L241.54,707.12 L241.57,707.11 L241.61,707.1 L241.64,707.09 L241.68,707.09 L241.71,707.08 L241.74,707.08 L241.81,707.07 L241.87,707.07 L241.93,707.07 L241.9,707.67 C241.13,707.67,240.78,708.55,240.78,709.03 V709.75 C240.78,710.34,241.36,710.87,241.98,710.87 C242.72,710.87,243.3,710.14,243.3,709.28 C243.3,708.32,242.6,707.67,241.9,707.67 L241.93,707.07 C243.02,707.07,243.99,708.01,243.99,709.28 C243.99,710.5,243.1,711.47,242.04,711.47 C241.57,711.47,241.12,711.29,240.78,710.99 C240.78,711.28,240.76,711.41,240.38,711.41 H239.65 C239.49,711.41,239.24,711.41,239.24,711.11 C239.24,710.81,239.5,710.81,239.64,710.81 H240.09 V705.52 H239.65 C239.49,705.52,239.24,705.52,239.24,705.21 C239.24,704.92,239.5,704.92,239.64,704.92 H241.23 C241.37,704.92,241.62,704.92,241.62,705.21 C241.62,705.52,241.38,705.52,241.22,705.52 H240.78 Z " />
+<path
+   id="path4382"
+   fill="black"
+   stroke-width="0"
+   d="M250.13,703.76 L250.13,703.76 L250.13,703.77 L250.13,703.77 L250.13,703.77 L250.13,703.78 L250.13,703.78 L250.13,703.78 L250.13,703.79 L250.13,703.79 L250.13,703.79 L250.12,703.79 L250.12,703.8 L250.12,703.8 L250.12,703.8 L250.12,703.81 L250.12,703.81 L250.12,703.81 L250.11,703.82 L250.11,703.82 L250.11,703.83 L250.1,703.83 L250.1,703.84 L250.09,703.84 L250.09,703.85 C249.63,704.34,248.96,705.14,248.54,706.77 C248.31,707.67,248.22,708.7,248.22,709.62 C248.22,712.24,248.85,714.07,250.04,715.36 C250.13,715.45,250.13,715.47,250.13,715.49 C250.13,715.59,250.05,715.59,250.01,715.59 C249.86,715.59,249.32,715,249.19,714.85 C248.18,713.64,247.53,711.85,247.53,709.63 C247.53,708.22,247.78,706.22,249.08,704.54 C249.18,704.42,249.83,703.66,250.01,703.66 C250.05,703.66,250.13,703.66,250.13,703.76 Z " />
+<path
+   id="path4384"
+   fill="black"
+   stroke-width="0"
+   d="M254.31,713.15 L254.32,713.18 L254.32,713.21 L254.33,713.24 L254.34,713.27 L254.35,713.3 L254.36,713.32 L254.37,713.35 L254.38,713.37 L254.39,713.39 L254.4,713.41 L254.42,713.43 L254.43,713.45 L254.45,713.47 L254.47,713.49 L254.49,713.5 L254.52,713.51 L254.55,713.53 L254.58,713.54 L254.61,713.55 L254.64,713.56 L254.66,713.57 L254.68,713.57 L254.7,713.57 L254.72,713.58 L254.74,713.58 L254.77,713.59 L254.79,713.59 L254.82,713.59 L254.84,713.59 L254.87,713.6 L254.9,713.6 L254.93,713.6 L254.96,713.6 L254.99,713.61 L255.02,713.61 L255.05,713.61 L255.09,713.61 L255.12,713.61 L255.16,713.61 L255.2,713.61 L255.24,713.61 L255.28,713.61 L255.32,713.61 L255.37,713.61 C255.66,713.61,255.74,713.61,255.74,713.8 C255.74,713.92,255.63,713.92,255.58,713.92 C255.26,713.92,254.44,713.89,254.11,713.89 C253.81,713.89,253.08,713.92,252.78,713.92 C252.71,713.92,252.59,713.92,252.59,713.72 C252.59,713.61,252.68,713.61,252.87,713.61 C252.89,713.61,253.08,713.61,253.25,713.59 C253.43,713.57,253.52,713.56,253.52,713.43 C253.52,713.4,253.51,713.36,253.48,713.25 L252.15,707.9 C252.04,707.51,252.02,707.43,251.24,707.43 C251.07,707.43,250.97,707.43,250.97,707.23 C250.97,707.12,251.06,707.12,251.24,707.12 H255.85 C256.09,707.12,256.1,707.12,256.16,707.29 L256.95,709.44 C256.99,709.55,256.99,709.57,256.99,709.58 C256.99,709.62,256.96,709.69,256.87,709.69 C256.78,709.69,256.77,709.64,256.7,709.48 C256.36,708.57,255.92,707.43,254.2,707.43 H253.26 C253.12,707.43,253.1,707.43,253.04,707.44 C252.94,707.45,252.91,707.46,252.91,707.54 C252.91,707.57,252.91,707.59,252.96,707.77 Z " />
+<path
+   id="path4386"
+   fill="black"
+   stroke-width="0"
+   d="M260.88,706.9 H260.64 C260.62,706.74,260.55,706.33,260.46,706.26 C260.4,706.22,259.87,706.22,259.77,706.22 H258.49 C259.22,706.87,259.46,707.06,259.88,707.39 C260.4,707.8,260.88,708.23,260.88,708.89 C260.88,709.73,260.14,710.25,259.25,710.25 C258.38,710.25,257.8,709.64,257.8,709 C257.8,708.65,258.1,708.61,258.17,708.61 C258.33,708.61,258.54,708.73,258.54,708.98 C258.54,709.11,258.49,709.35,258.13,709.35 C258.34,709.84,258.82,710,259.14,710 C259.84,710,260.2,709.46,260.2,708.89 C260.2,708.29,259.77,707.81,259.55,707.56 L257.87,705.9 C257.8,705.84,257.8,705.83,257.8,705.63 H260.67 Z " />
+<path
+   id="path4388"
+   fill="black"
+   stroke-width="0"
+   d="M263.85,707.14 L263.85,707.2 L263.85,707.26 L263.85,707.31 L263.84,707.37 L263.84,707.42 L263.83,707.48 L263.82,707.53 L263.81,707.58 L263.8,707.62 L263.78,707.67 L263.77,707.71 L263.75,707.75 L263.74,707.79 L263.72,707.83 L263.7,707.87 L263.68,707.9 L263.66,707.94 L263.64,707.97 L263.61,708 L263.59,708.02 L263.56,708.05 L263.54,708.07 L263.51,708.09 L263.48,708.11 L263.45,708.13 L263.42,708.14 L263.39,708.15 L263.35,708.16 L263.32,708.17 L263.29,708.18 L263.25,708.18 L263.22,708.18 C262.89,708.18,262.69,707.93,262.69,707.65 C262.69,707.38,262.89,707.12,263.22,707.12 C263.33,707.12,263.46,707.16,263.57,707.25 C263.59,707.27,263.6,707.28,263.61,707.28 C263.62,707.28,263.63,707.27,263.63,707.14 C263.63,706.4,263.29,705.8,262.96,705.47 C262.85,705.36,262.85,705.34,262.85,705.31 C262.85,705.24,262.9,705.2,262.95,705.2 C263.06,705.2,263.85,705.97,263.85,707.14 Z " />
+<path
+   id="path4390"
+   fill="black"
+   stroke-width="0"
+   d="M271.65,713.2 L271.66,713.23 L271.67,713.25 L271.68,713.28 L271.68,713.31 L271.69,713.33 L271.7,713.36 L271.7,713.38 L271.71,713.4 L271.72,713.42 L271.73,713.44 L271.74,713.46 L271.75,713.47 L271.76,713.49 L271.77,713.5 L271.79,713.52 L271.8,713.53 L271.82,713.54 L271.84,713.55 L271.86,713.56 L271.88,713.57 L271.9,713.58 L271.92,713.58 L271.95,713.59 L271.97,713.59 L271.98,713.59 L272,713.6 L272.01,713.6 L272.03,713.6 L272.05,713.6 L272.06,713.61 L272.08,713.61 L272.1,713.61 L272.12,713.61 L272.14,713.61 L272.16,713.61 L272.18,713.61 L272.21,713.61 L272.23,713.61 L272.25,713.61 L272.28,713.61 L272.3,713.61 C272.46,713.61,272.57,713.61,272.57,713.8 C272.57,713.89,272.51,713.92,272.43,713.92 C272.18,713.92,271.58,713.89,271.33,713.89 C271,713.89,270.19,713.92,269.86,713.92 C269.77,713.92,269.65,713.92,269.65,713.72 C269.65,713.61,269.73,713.61,269.99,713.61 C270.22,713.61,270.32,713.61,270.57,713.59 C270.81,713.56,270.88,713.53,270.88,713.4 C270.88,713.34,270.86,713.27,270.84,713.19 L269.69,708.62 C269.45,707.65,268.77,707.12,268.26,707.12 C268,707.12,267.47,707.22,267.31,707.74 C267.34,707.73,267.41,707.73,267.43,707.73 C267.82,707.73,268.08,708.07,268.08,708.37 C268.08,708.69,267.81,708.79,267.64,708.79 C267.46,708.79,266.97,708.67,266.97,707.99 C266.97,707.37,267.5,706.91,268.29,706.91 C269.2,706.91,270.24,707.56,270.49,708.55 Z " />
+<path
+   id="path4392"
+   fill="black"
+   stroke-width="0"
+   d="M274.11,710.05 L274.11,710.06 L274.11,710.07 L274.11,710.08 L274.11,710.09 L274.11,710.09 L274.11,710.1 L274.11,710.11 L274.11,710.12 L274.11,710.12 L274.11,710.13 L274.11,710.13 L274.11,710.14 L274.11,710.15 L274.11,710.15 L274.11,710.16 L274.11,710.16 L274.11,710.17 L274.11,710.17 L274.11,710.18 L274.1,710.19 L274.1,710.2 L274.1,710.2 L274.09,710.21 L274.09,710.22 L274.08,710.22 L274.08,710.23 L274.07,710.23 L274.07,710.23 L274.06,710.24 L274.05,710.24 L274.04,710.24 L274.03,710.24 L274.03,710.24 L274.02,710.24 L274.02,710.24 L274.01,710.25 L274,710.25 L274,710.25 L273.99,710.25 L273.98,710.25 L273.98,710.25 L273.97,710.25 L273.96,710.25 L273.96,710.25 L273.95,710.25 L273.94,710.25 L273.93,710.25 L273.92,710.25 L273.92,710.25 L273.91,710.25 C273.46,709.81,272.83,709.8,272.54,709.8 V709.55 C272.71,709.55,273.17,709.55,273.55,709.75 V706.2 C273.55,705.97,273.55,705.88,272.86,705.88 H272.59 V705.63 C272.71,705.64,273.57,705.66,273.83,705.66 C274.05,705.66,274.92,705.64,275.08,705.63 V705.88 H274.81 C274.11,705.88,274.11,705.97,274.11,706.2 Z " />
+<path
+   id="path4394"
+   fill="black"
+   stroke-width="0"
+   d="M278.27,707.14 L278.27,707.2 L278.27,707.26 L278.27,707.31 L278.26,707.37 L278.26,707.42 L278.25,707.48 L278.24,707.53 L278.23,707.58 L278.22,707.62 L278.21,707.67 L278.19,707.71 L278.18,707.75 L278.16,707.79 L278.14,707.83 L278.12,707.87 L278.1,707.9 L278.08,707.94 L278.06,707.97 L278.03,708 L278.01,708.02 L277.98,708.05 L277.96,708.07 L277.93,708.09 L277.9,708.11 L277.87,708.13 L277.84,708.14 L277.81,708.15 L277.78,708.16 L277.74,708.17 L277.71,708.18 L277.67,708.18 L277.64,708.18 C277.31,708.18,277.11,707.93,277.11,707.65 C277.11,707.38,277.31,707.12,277.64,707.12 C277.76,707.12,277.89,707.16,277.99,707.25 C278.02,707.27,278.02,707.28,278.04,707.28 C278.05,707.28,278.05,707.27,278.05,707.14 C278.05,706.4,277.71,705.8,277.38,705.47 C277.27,705.36,277.27,705.34,277.27,705.31 C277.27,705.24,277.32,705.2,277.37,705.2 C277.48,705.2,278.27,705.97,278.27,707.14 Z " />
+<path
+   id="path4396"
+   fill="black"
+   stroke-width="0"
+   d="M282.59,709.61 L282.59,709.64 L282.59,709.67 L282.59,709.69 L282.58,709.72 L282.58,709.74 L282.57,709.77 L282.56,709.79 L282.55,709.82 L282.54,709.84 L282.53,709.86 L282.52,709.89 L282.5,709.91 L282.49,709.93 L282.47,709.95 L282.45,709.97 L282.44,709.99 L282.42,710 L282.4,710.02 L282.38,710.04 L282.36,710.05 L282.34,710.06 L282.32,710.08 L282.29,710.09 L282.27,710.1 L282.25,710.11 L282.22,710.12 L282.2,710.12 L282.17,710.13 L282.14,710.13 L282.12,710.14 L282.09,710.14 L282.07,710.14 C281.78,710.14,281.54,709.9,281.54,709.61 C281.54,709.32,281.78,709.09,282.07,709.09 C282.35,709.09,282.59,709.32,282.59,709.61 Z " />
+<path
+   id="path4398"
+   fill="black"
+   stroke-width="0"
+   d="M287.02,709.61 L287.02,709.64 L287.02,709.67 L287.02,709.69 L287.01,709.72 L287.01,709.74 L287,709.77 L286.99,709.79 L286.98,709.82 L286.97,709.84 L286.96,709.86 L286.95,709.89 L286.93,709.91 L286.92,709.93 L286.9,709.95 L286.89,709.97 L286.87,709.99 L286.85,710 L286.83,710.02 L286.81,710.04 L286.79,710.05 L286.77,710.06 L286.75,710.08 L286.72,710.09 L286.7,710.1 L286.68,710.11 L286.65,710.12 L286.63,710.12 L286.6,710.13 L286.58,710.13 L286.55,710.14 L286.52,710.14 L286.5,710.14 C286.21,710.14,285.97,709.9,285.97,709.61 C285.97,709.32,286.21,709.09,286.5,709.09 C286.79,709.09,287.02,709.32,287.02,709.61 Z " />
+<path
+   id="path4400"
+   fill="black"
+   stroke-width="0"
+   d="M291.45,709.61 L291.45,709.64 L291.44,709.67 L291.44,709.69 L291.44,709.72 L291.43,709.74 L291.42,709.77 L291.41,709.79 L291.4,709.82 L291.39,709.84 L291.38,709.86 L291.37,709.89 L291.35,709.91 L291.34,709.93 L291.32,709.95 L291.31,709.97 L291.29,709.99 L291.27,710 L291.25,710.02 L291.23,710.04 L291.21,710.05 L291.19,710.06 L291.17,710.08 L291.14,710.09 L291.12,710.1 L291.1,710.11 L291.07,710.12 L291.05,710.12 L291.02,710.13 L291,710.13 L290.97,710.14 L290.94,710.14 L290.92,710.14 C290.63,710.14,290.39,709.9,290.39,709.61 C290.39,709.32,290.63,709.09,290.92,709.09 C291.21,709.09,291.45,709.32,291.45,709.61 Z " />
+<path
+   id="path4402"
+   fill="black"
+   stroke-width="0"
+   d="M295.99,707.14 L295.99,707.2 L295.98,707.26 L295.98,707.31 L295.97,707.37 L295.97,707.42 L295.96,707.48 L295.95,707.53 L295.94,707.58 L295.93,707.62 L295.92,707.67 L295.9,707.71 L295.89,707.75 L295.87,707.79 L295.85,707.83 L295.83,707.87 L295.81,707.9 L295.79,707.94 L295.77,707.97 L295.75,708 L295.72,708.02 L295.69,708.05 L295.67,708.07 L295.64,708.09 L295.61,708.11 L295.58,708.13 L295.55,708.14 L295.52,708.15 L295.49,708.16 L295.45,708.17 L295.42,708.18 L295.38,708.18 L295.35,708.18 C295.02,708.18,294.82,707.93,294.82,707.65 C294.82,707.38,295.02,707.12,295.35,707.12 C295.47,707.12,295.6,707.16,295.7,707.25 C295.73,707.27,295.74,707.28,295.75,707.28 C295.76,707.28,295.77,707.27,295.77,707.14 C295.77,706.4,295.42,705.8,295.09,705.47 C294.98,705.36,294.98,705.34,294.98,705.31 C294.98,705.24,295.03,705.2,295.08,705.2 C295.19,705.2,295.99,705.97,295.99,707.14 Z " />
+<path
+   id="path4404"
+   fill="black"
+   stroke-width="0"
+   d="M303.79,713.2 L303.79,713.23 L303.8,713.25 L303.81,713.28 L303.81,713.31 L303.82,713.33 L303.83,713.36 L303.84,713.38 L303.84,713.4 L303.85,713.42 L303.86,713.44 L303.87,713.46 L303.88,713.47 L303.89,713.49 L303.91,713.5 L303.92,713.52 L303.93,713.53 L303.95,713.54 L303.97,713.55 L303.99,713.56 L304.01,713.57 L304.03,713.58 L304.06,713.58 L304.08,713.59 L304.1,713.59 L304.11,713.59 L304.13,713.6 L304.14,713.6 L304.16,713.6 L304.18,713.6 L304.2,713.61 L304.21,713.61 L304.23,713.61 L304.25,713.61 L304.27,713.61 L304.29,713.61 L304.31,713.61 L304.34,713.61 L304.36,713.61 L304.38,713.61 L304.41,713.61 L304.43,713.61 C304.59,713.61,304.7,713.61,304.7,713.8 C304.7,713.89,304.64,713.92,304.56,713.92 C304.32,713.92,303.71,713.89,303.46,713.89 C303.13,713.89,302.32,713.92,301.99,713.92 C301.9,713.92,301.78,713.92,301.78,713.72 C301.78,713.61,301.86,713.61,302.12,713.61 C302.35,713.61,302.45,713.61,302.7,713.59 C302.94,713.56,303.01,713.53,303.01,713.4 C303.01,713.34,302.99,713.27,302.97,713.19 L301.82,708.62 C301.58,707.65,300.9,707.12,300.39,707.12 C300.13,707.12,299.6,707.22,299.44,707.74 C299.47,707.73,299.54,707.73,299.56,707.73 C299.95,707.73,300.21,708.07,300.21,708.37 C300.21,708.69,299.94,708.79,299.77,708.79 C299.59,708.79,299.1,708.67,299.1,707.99 C299.1,707.37,299.63,706.91,300.42,706.91 C301.33,706.91,302.37,707.56,302.62,708.55 Z " />
+<path
+   id="path4406"
+   fill="black"
+   stroke-width="0"
+   d="M305.27,710.27 L305.27,710.28 L305.27,710.29 L305.27,710.3 L305.27,710.31 L305.26,710.33 L305.26,710.34 L305.26,710.36 L305.26,710.37 L305.26,710.38 L305.26,710.39 L305.26,710.4 L305.25,710.41 L305.25,710.42 L305.25,710.43 L305.25,710.44 L305.24,710.45 L305.24,710.46 L305.23,710.47 L305.23,710.48 L305.22,710.49 L305.21,710.5 L305.2,710.51 L305.2,710.51 L305.2,710.51 L305.19,710.52 L305.19,710.52 L305.18,710.52 L305.18,710.52 L305.17,710.53 L305.17,710.53 L305.16,710.53 L305.15,710.53 L305.15,710.54 L305.14,710.54 L305.14,710.54 L305.13,710.54 L305.12,710.54 L305.11,710.54 L305.11,710.54 L305.1,710.54 C304.92,710.54,304.92,710.38,304.92,710.27 V703.86 C304.92,703.76,304.92,703.59,305.09,703.59 C305.27,703.59,305.27,703.75,305.27,703.86 Z " />
+<path
+   id="path4408"
+   fill="black"
+   stroke-width="0"
+   d="M310.44,709.54 L310.44,709.56 L310.45,709.58 L310.46,709.6 L310.46,709.62 L310.47,709.64 L310.47,709.66 L310.48,709.67 L310.48,709.69 L310.49,709.7 L310.49,709.71 L310.5,709.73 L310.51,709.74 L310.52,709.75 L310.53,709.76 L310.54,709.77 L310.55,709.77 L310.56,709.78 L310.57,709.79 L310.58,709.79 L310.6,709.8 L310.61,709.8 L310.63,709.81 L310.65,709.81 L310.66,709.81 L310.67,709.81 L310.68,709.82 L310.69,709.82 L310.7,709.82 L310.72,709.82 L310.73,709.82 L310.74,709.82 L310.75,709.82 L310.77,709.82 L310.78,709.82 L310.8,709.82 L310.81,709.82 L310.83,709.82 L310.85,709.82 L310.86,709.82 L310.88,709.82 L310.9,709.83 C310.98,709.83,311.08,709.83,311.08,709.97 C311.08,710.05,311.02,710.08,310.98,710.08 C310.81,710.08,310.39,710.05,310.22,710.05 C310.08,710.05,309.84,710.05,309.69,710.05 C309.51,710.06,309.31,710.08,309.14,710.08 C309.09,710.08,308.98,710.08,308.98,709.93 C308.98,709.83,309.05,709.83,309.26,709.83 C309.42,709.83,309.44,709.83,309.62,709.81 C309.82,709.79,309.84,709.77,309.84,709.69 C309.84,709.64,309.84,709.62,309.81,709.53 L309.01,706.34 C308.88,705.82,308.43,705.38,307.98,705.38 C307.88,705.38,307.44,705.4,307.28,705.74 C307.69,705.74,307.78,706.07,307.78,706.2 C307.78,706.39,307.61,706.49,307.46,706.49 C307.27,706.49,306.99,706.34,306.99,705.95 C306.99,705.5,307.42,705.19,308,705.19 C308.68,705.19,309.46,705.62,309.63,706.32 Z " />
+<path
+   id="path4410"
+   fill="black"
+   stroke-width="0"
+   d="M312.7,710.27 L312.7,710.28 L312.7,710.29 L312.7,710.3 L312.7,710.31 L312.7,710.33 L312.7,710.34 L312.7,710.36 L312.69,710.37 L312.69,710.38 L312.69,710.39 L312.69,710.4 L312.69,710.41 L312.68,710.42 L312.68,710.43 L312.68,710.44 L312.67,710.45 L312.67,710.46 L312.66,710.47 L312.66,710.48 L312.65,710.49 L312.64,710.5 L312.64,710.51 L312.63,710.51 L312.63,710.51 L312.62,710.52 L312.62,710.52 L312.61,710.52 L312.61,710.52 L312.6,710.53 L312.6,710.53 L312.59,710.53 L312.59,710.53 L312.58,710.54 L312.57,710.54 L312.57,710.54 L312.56,710.54 L312.55,710.54 L312.55,710.54 L312.54,710.54 L312.53,710.54 C312.36,710.54,312.36,710.38,312.36,710.27 V703.86 C312.36,703.76,312.36,703.59,312.52,703.59 C312.7,703.59,312.7,703.75,312.7,703.86 Z " />
+<path
+   id="path4412"
+   fill="black"
+   stroke-width="0"
+   d="M317.25,709.62 L317.25,709.89 L317.24,710.18 L317.22,710.47 L317.19,710.78 L317.15,711.09 L317.1,711.41 L317.04,711.74 L316.96,712.07 L316.92,712.24 L316.87,712.4 L316.82,712.57 L316.76,712.74 L316.7,712.91 L316.64,713.07 L316.57,713.24 L316.49,713.41 L316.41,713.58 L316.32,713.74 L316.23,713.91 L316.14,714.07 L316.04,714.24 L315.93,714.4 L315.82,714.56 L315.7,714.72 C315.6,714.84,314.95,715.59,314.77,715.59 C314.72,715.59,314.65,715.57,314.65,715.49 C314.65,715.45,314.67,715.42,314.71,715.39 C315.19,714.88,315.84,714.07,316.24,712.49 C316.47,711.58,316.56,710.56,316.56,709.63 C316.56,708.63,316.47,707.61,316.21,706.64 C315.84,705.24,315.25,704.45,314.74,703.89 C314.65,703.8,314.65,703.78,314.65,703.76 C314.65,703.68,314.72,703.66,314.77,703.66 C314.92,703.66,315.47,704.27,315.59,704.41 C316.6,705.61,317.25,707.4,317.25,709.62 Z " />
+</g>    <g
+       id="g4738"
+       transform="matrix(1,0,0,-1,-192.9308,1111.7528)"
+       xml:space="preserve"
+       stroke="black"
+       stroke-linecap="butt"
+       stroke-linejoin="miter"
+       stroke-miterlimit="10.433"
+       stroke-dasharray="none"
+       stroke-dashoffset="0"
+       stroke-opacity="1"
+       fill="none"
+       fill-rule="evenodd"
+       fill-opacity="1"
+       font-style="normal"
+       font-variant="normal"
+       font-weight="normal"
+       font-stretch="normal"
+       font-size-adjust="none"
+       letter-spacing="normal"
+       word-spacing="normal"
+       text-anchor="start"
+       ns0:text="$L_2 \\left(J_1, \\cdots, J_{|J|}\\right)$"
+       ns0:preamble=""
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0">
+<path
+   d="M227.16,713.15 L227.17,713.18 L227.18,713.21 L227.18,713.24 L227.19,713.27 L227.2,713.3 L227.21,713.32 L227.22,713.35 L227.23,713.37 L227.24,713.39 L227.26,713.41 L227.27,713.43 L227.29,713.45 L227.3,713.47 L227.32,713.49 L227.35,713.5 L227.37,713.51 L227.4,713.53 L227.43,713.54 L227.46,713.55 L227.49,713.56 L227.51,713.57 L227.53,713.57 L227.55,713.57 L227.57,713.58 L227.6,713.58 L227.62,713.59 L227.64,713.59 L227.67,713.59 L227.7,713.59 L227.72,713.6 L227.75,713.6 L227.78,713.6 L227.81,713.6 L227.84,713.61 L227.87,713.61 L227.91,713.61 L227.94,713.61 L227.98,713.61 L228.01,713.61 L228.05,713.61 L228.09,713.61 L228.13,713.61 L228.17,713.61 L228.22,713.61 C228.52,713.61,228.6,713.61,228.6,713.8 C228.6,713.92,228.49,713.92,228.44,713.92 C228.11,713.92,227.29,713.89,226.96,713.89 C226.66,713.89,225.93,713.92,225.63,713.92 C225.57,713.92,225.45,713.92,225.45,713.72 C225.45,713.61,225.54,713.61,225.73,713.61 C225.74,713.61,225.93,713.61,226.1,713.59 C226.28,713.57,226.37,713.56,226.37,713.43 C226.37,713.4,226.36,713.36,226.33,713.25 L225,707.9 C224.9,707.51,224.88,707.43,224.09,707.43 C223.92,707.43,223.82,707.43,223.82,707.23 C223.82,707.12,223.91,707.12,224.09,707.12 H228.71 C228.95,707.12,228.95,707.12,229.01,707.29 L229.8,709.44 C229.84,709.55,229.84,709.57,229.84,709.58 C229.84,709.62,229.81,709.69,229.72,709.69 C229.63,709.69,229.62,709.64,229.55,709.48 C229.21,708.57,228.77,707.43,227.05,707.43 H226.11 C225.97,707.43,225.95,707.43,225.89,707.44 C225.79,707.45,225.76,707.46,225.76,707.54 C225.76,707.57,225.76,707.59,225.81,707.77 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4740" />
+<path
+   d="M233.73,706.9 H233.49 C233.47,706.74,233.4,706.33,233.31,706.26 C233.26,706.22,232.72,706.22,232.62,706.22 H231.34 C232.07,706.87,232.32,707.06,232.73,707.39 C233.25,707.8,233.73,708.23,233.73,708.89 C233.73,709.73,232.99,710.25,232.1,710.25 C231.24,710.25,230.65,709.64,230.65,709 C230.65,708.65,230.95,708.61,231.02,708.61 C231.19,708.61,231.39,708.73,231.39,708.98 C231.39,709.11,231.34,709.35,230.98,709.35 C231.19,709.84,231.67,710,231.99,710 C232.69,710,233.05,709.46,233.05,708.89 C233.05,708.29,232.62,707.81,232.4,707.56 L230.72,705.9 C230.65,705.84,230.65,705.83,230.65,705.63 H233.52 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4742" />
+<path
+   d="M240.46,703.76 L240.46,703.76 L240.46,703.77 L240.46,703.77 L240.46,703.77 L240.46,703.78 L240.46,703.78 L240.46,703.78 L240.46,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.79 L240.45,703.8 L240.45,703.8 L240.45,703.8 L240.45,703.81 L240.45,703.81 L240.44,703.81 L240.44,703.82 L240.44,703.82 L240.43,703.83 L240.43,703.83 L240.43,703.84 L240.42,703.84 L240.42,703.85 C239.96,704.34,239.28,705.14,238.86,706.77 C238.63,707.67,238.54,708.7,238.54,709.62 C238.54,712.24,239.17,714.07,240.37,715.36 C240.46,715.45,240.46,715.47,240.46,715.49 C240.46,715.59,240.38,715.59,240.34,715.59 C240.19,715.59,239.65,715,239.52,714.85 C238.51,713.64,237.86,711.85,237.86,709.63 C237.86,708.22,238.11,706.22,239.41,704.54 C239.51,704.42,240.16,703.66,240.34,703.66 C240.38,703.66,240.46,703.66,240.46,703.76 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4744" />
+<path
+   d="M246.3,713.2 L246.31,713.23 L246.32,713.25 L246.32,713.28 L246.33,713.31 L246.34,713.33 L246.34,713.36 L246.35,713.38 L246.36,713.4 L246.37,713.42 L246.38,713.44 L246.39,713.46 L246.4,713.47 L246.41,713.49 L246.42,713.5 L246.43,713.52 L246.45,713.53 L246.47,713.54 L246.48,713.55 L246.5,713.56 L246.52,713.57 L246.55,713.58 L246.57,713.58 L246.6,713.59 L246.61,713.59 L246.63,713.59 L246.64,713.6 L246.66,713.6 L246.68,713.6 L246.69,713.6 L246.71,713.61 L246.73,713.61 L246.75,713.61 L246.77,713.61 L246.79,713.61 L246.81,713.61 L246.83,713.61 L246.85,713.61 L246.88,713.61 L246.9,713.61 L246.92,713.61 L246.95,713.61 C247.11,713.61,247.22,713.61,247.22,713.8 C247.22,713.89,247.16,713.92,247.08,713.92 C246.83,713.92,246.22,713.89,245.97,713.89 C245.64,713.89,244.84,713.92,244.51,713.92 C244.42,713.92,244.3,713.92,244.3,713.72 C244.3,713.61,244.38,713.61,244.64,713.61 C244.87,713.61,244.96,713.61,245.21,713.59 C245.45,713.56,245.52,713.53,245.52,713.4 C245.52,713.34,245.5,713.27,245.48,713.19 L244.34,708.62 C244.1,707.65,243.42,707.12,242.9,707.12 C242.64,707.12,242.11,707.22,241.96,707.74 C241.99,707.73,242.05,707.73,242.07,707.73 C242.46,707.73,242.72,708.07,242.72,708.37 C242.72,708.69,242.45,708.79,242.28,708.79 C242.1,708.79,241.62,708.67,241.62,707.99 C241.62,707.37,242.14,706.91,242.93,706.91 C243.85,706.91,244.88,707.56,245.13,708.55 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4746" />
+<path
+   d="M248.77,710.05 L248.77,710.06 L248.77,710.07 L248.77,710.08 L248.77,710.09 L248.77,710.09 L248.77,710.1 L248.77,710.11 L248.77,710.12 L248.76,710.12 L248.76,710.13 L248.76,710.13 L248.76,710.14 L248.76,710.15 L248.76,710.15 L248.76,710.16 L248.76,710.16 L248.76,710.17 L248.76,710.17 L248.76,710.18 L248.75,710.19 L248.75,710.2 L248.75,710.2 L248.74,710.21 L248.74,710.22 L248.73,710.22 L248.73,710.23 L248.72,710.23 L248.72,710.23 L248.71,710.24 L248.7,710.24 L248.69,710.24 L248.68,710.24 L248.68,710.24 L248.67,710.24 L248.67,710.24 L248.66,710.25 L248.65,710.25 L248.65,710.25 L248.64,710.25 L248.64,710.25 L248.63,710.25 L248.62,710.25 L248.61,710.25 L248.61,710.25 L248.6,710.25 L248.59,710.25 L248.58,710.25 L248.57,710.25 L248.57,710.25 L248.56,710.25 C248.11,709.81,247.48,709.8,247.19,709.8 V709.55 C247.36,709.55,247.82,709.55,248.2,709.75 V706.2 C248.2,705.97,248.2,705.88,247.51,705.88 H247.24 V705.63 C247.37,705.64,248.22,705.66,248.48,705.66 C248.7,705.66,249.57,705.64,249.73,705.63 V705.88 H249.46 C248.77,705.88,248.77,705.97,248.77,706.2 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4748" />
+<path
+   d="M252.93,707.14 L252.93,707.2 L252.92,707.26 L252.92,707.31 L252.91,707.37 L252.91,707.42 L252.9,707.48 L252.89,707.53 L252.88,707.58 L252.87,707.62 L252.86,707.67 L252.84,707.71 L252.83,707.75 L252.81,707.79 L252.79,707.83 L252.77,707.87 L252.75,707.9 L252.73,707.94 L252.71,707.97 L252.69,708 L252.66,708.02 L252.63,708.05 L252.61,708.07 L252.58,708.09 L252.55,708.11 L252.52,708.13 L252.49,708.14 L252.46,708.15 L252.43,708.16 L252.39,708.17 L252.36,708.18 L252.32,708.18 L252.29,708.18 C251.96,708.18,251.76,707.93,251.76,707.65 C251.76,707.38,251.96,707.12,252.29,707.12 C252.41,707.12,252.54,707.16,252.64,707.25 C252.67,707.27,252.68,707.28,252.69,707.28 C252.7,707.28,252.71,707.27,252.71,707.14 C252.71,706.4,252.36,705.8,252.03,705.47 C251.92,705.36,251.92,705.34,251.92,705.31 C251.92,705.24,251.97,705.2,252.02,705.2 C252.13,705.2,252.93,705.97,252.93,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4750" />
+<path
+   d="M257.24,709.61 L257.24,709.64 L257.24,709.67 L257.24,709.69 L257.23,709.72 L257.23,709.74 L257.22,709.77 L257.21,709.79 L257.2,709.82 L257.19,709.84 L257.18,709.86 L257.17,709.89 L257.15,709.91 L257.14,709.93 L257.12,709.95 L257.11,709.97 L257.09,709.99 L257.07,710 L257.05,710.02 L257.03,710.04 L257.01,710.05 L256.99,710.06 L256.97,710.08 L256.94,710.09 L256.92,710.1 L256.9,710.11 L256.87,710.12 L256.85,710.12 L256.82,710.13 L256.8,710.13 L256.77,710.14 L256.74,710.14 L256.72,710.14 C256.43,710.14,256.19,709.9,256.19,709.61 C256.19,709.32,256.43,709.09,256.72,709.09 C257.01,709.09,257.24,709.32,257.24,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4752" />
+<path
+   d="M261.67,709.61 L261.67,709.64 L261.67,709.67 L261.67,709.69 L261.66,709.72 L261.66,709.74 L261.65,709.77 L261.64,709.79 L261.63,709.82 L261.62,709.84 L261.61,709.86 L261.6,709.89 L261.58,709.91 L261.57,709.93 L261.55,709.95 L261.54,709.97 L261.52,709.99 L261.5,710 L261.48,710.02 L261.46,710.04 L261.44,710.05 L261.42,710.06 L261.4,710.08 L261.37,710.09 L261.35,710.1 L261.33,710.11 L261.3,710.12 L261.28,710.12 L261.25,710.13 L261.23,710.13 L261.2,710.14 L261.17,710.14 L261.15,710.14 C260.86,710.14,260.62,709.9,260.62,709.61 C260.62,709.32,260.86,709.09,261.15,709.09 C261.44,709.09,261.67,709.32,261.67,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4754" />
+<path
+   d="M266.1,709.61 L266.1,709.64 L266.09,709.67 L266.09,709.69 L266.09,709.72 L266.08,709.74 L266.07,709.77 L266.06,709.79 L266.05,709.82 L266.04,709.84 L266.03,709.86 L266.02,709.89 L266.01,709.91 L265.99,709.93 L265.98,709.95 L265.96,709.97 L265.94,709.99 L265.92,710 L265.9,710.02 L265.88,710.04 L265.86,710.05 L265.84,710.06 L265.82,710.08 L265.8,710.09 L265.77,710.1 L265.75,710.11 L265.72,710.12 L265.7,710.12 L265.67,710.13 L265.65,710.13 L265.62,710.14 L265.59,710.14 L265.57,710.14 C265.28,710.14,265.04,709.9,265.04,709.61 C265.04,709.32,265.28,709.09,265.57,709.09 C265.86,709.09,266.1,709.32,266.1,709.61 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4756" />
+<path
+   d="M270.64,707.14 L270.64,707.2 L270.63,707.26 L270.63,707.31 L270.63,707.37 L270.62,707.42 L270.61,707.48 L270.6,707.53 L270.59,707.58 L270.58,707.62 L270.57,707.67 L270.55,707.71 L270.54,707.75 L270.52,707.79 L270.5,707.83 L270.48,707.87 L270.46,707.9 L270.44,707.94 L270.42,707.97 L270.4,708 L270.37,708.02 L270.35,708.05 L270.32,708.07 L270.29,708.09 L270.26,708.11 L270.23,708.13 L270.2,708.14 L270.17,708.15 L270.14,708.16 L270.1,708.17 L270.07,708.18 L270.03,708.18 L270,708.18 C269.67,708.18,269.47,707.93,269.47,707.65 C269.47,707.38,269.67,707.12,270,707.12 C270.12,707.12,270.25,707.16,270.35,707.25 C270.38,707.27,270.39,707.28,270.4,707.28 C270.41,707.28,270.42,707.27,270.42,707.14 C270.42,706.4,270.07,705.8,269.74,705.47 C269.63,705.36,269.63,705.34,269.63,705.31 C269.63,705.24,269.68,705.2,269.73,705.2 C269.84,705.2,270.64,705.97,270.64,707.14 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4758" />
+<path
+   d="M278.44,713.2 L278.44,713.23 L278.45,713.25 L278.46,713.28 L278.47,713.31 L278.47,713.33 L278.48,713.36 L278.49,713.38 L278.49,713.4 L278.5,713.42 L278.51,713.44 L278.52,713.46 L278.53,713.47 L278.54,713.49 L278.56,713.5 L278.57,713.52 L278.59,713.53 L278.6,713.54 L278.62,713.55 L278.64,713.56 L278.66,713.57 L278.68,713.58 L278.71,713.58 L278.73,713.59 L278.75,713.59 L278.76,713.59 L278.78,713.6 L278.8,713.6 L278.81,713.6 L278.83,713.6 L278.85,713.61 L278.86,713.61 L278.88,713.61 L278.9,713.61 L278.92,713.61 L278.94,713.61 L278.97,713.61 L278.99,713.61 L279.01,713.61 L279.04,713.61 L279.06,713.61 L279.08,713.61 C279.24,713.61,279.35,713.61,279.35,713.8 C279.35,713.89,279.29,713.92,279.21,713.92 C278.97,713.92,278.36,713.89,278.11,713.89 C277.78,713.89,276.97,713.92,276.64,713.92 C276.55,713.92,276.43,713.92,276.43,713.72 C276.43,713.61,276.51,713.61,276.77,713.61 C277,713.61,277.1,713.61,277.35,713.59 C277.59,713.56,277.66,713.53,277.66,713.4 C277.66,713.34,277.64,713.27,277.62,713.19 L276.47,708.62 C276.23,707.65,275.56,707.12,275.04,707.12 C274.78,707.12,274.25,707.22,274.09,707.74 C274.12,707.73,274.19,707.73,274.21,707.73 C274.6,707.73,274.86,708.07,274.86,708.37 C274.86,708.69,274.59,708.79,274.42,708.79 C274.24,708.79,273.75,708.67,273.75,707.99 C273.75,707.37,274.28,706.91,275.07,706.91 C275.98,706.91,277.02,707.56,277.27,708.55 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4760" />
+<path
+   d="M279.92,710.27 L279.92,710.28 L279.92,710.29 L279.92,710.3 L279.92,710.31 L279.91,710.33 L279.91,710.34 L279.91,710.36 L279.91,710.37 L279.91,710.38 L279.91,710.39 L279.91,710.4 L279.9,710.41 L279.9,710.42 L279.9,710.43 L279.9,710.44 L279.89,710.45 L279.89,710.46 L279.88,710.47 L279.88,710.48 L279.87,710.49 L279.86,710.5 L279.85,710.51 L279.85,710.51 L279.85,710.51 L279.84,710.52 L279.84,710.52 L279.83,710.52 L279.83,710.52 L279.82,710.53 L279.82,710.53 L279.81,710.53 L279.8,710.53 L279.8,710.54 L279.79,710.54 L279.79,710.54 L279.78,710.54 L279.77,710.54 L279.76,710.54 L279.76,710.54 L279.75,710.54 C279.58,710.54,279.58,710.38,279.58,710.27 V703.86 C279.58,703.76,279.58,703.59,279.74,703.59 C279.92,703.59,279.92,703.75,279.92,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4762" />
+<path
+   d="M285.09,709.54 L285.1,709.56 L285.1,709.58 L285.11,709.6 L285.11,709.62 L285.12,709.64 L285.12,709.66 L285.13,709.67 L285.13,709.69 L285.14,709.7 L285.15,709.71 L285.15,709.73 L285.16,709.74 L285.17,709.75 L285.18,709.76 L285.19,709.77 L285.2,709.77 L285.21,709.78 L285.22,709.79 L285.23,709.79 L285.25,709.8 L285.26,709.8 L285.28,709.81 L285.3,709.81 L285.31,709.81 L285.32,709.81 L285.33,709.82 L285.34,709.82 L285.36,709.82 L285.37,709.82 L285.38,709.82 L285.39,709.82 L285.41,709.82 L285.42,709.82 L285.43,709.82 L285.45,709.82 L285.46,709.82 L285.48,709.82 L285.5,709.82 L285.51,709.82 L285.53,709.82 L285.55,709.83 C285.63,709.83,285.73,709.83,285.73,709.97 C285.73,710.05,285.67,710.08,285.63,710.08 C285.46,710.08,285.04,710.05,284.87,710.05 C284.73,710.05,284.49,710.05,284.34,710.05 C284.16,710.06,283.96,710.08,283.79,710.08 C283.74,710.08,283.63,710.08,283.63,709.93 C283.63,709.83,283.7,709.83,283.91,709.83 C284.07,709.83,284.09,709.83,284.27,709.81 C284.47,709.79,284.49,709.77,284.49,709.69 C284.49,709.64,284.49,709.62,284.46,709.53 L283.66,706.34 C283.53,705.82,283.08,705.38,282.63,705.38 C282.53,705.38,282.1,705.4,281.93,705.74 C282.34,705.74,282.43,706.07,282.43,706.2 C282.43,706.39,282.26,706.49,282.11,706.49 C281.92,706.49,281.64,706.34,281.64,705.95 C281.64,705.5,282.07,705.19,282.65,705.19 C283.33,705.19,284.11,705.62,284.28,706.32 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4764" />
+<path
+   d="M287.35,710.27 L287.35,710.28 L287.35,710.29 L287.35,710.3 L287.35,710.31 L287.35,710.33 L287.35,710.34 L287.35,710.36 L287.34,710.37 L287.34,710.38 L287.34,710.39 L287.34,710.4 L287.34,710.41 L287.33,710.42 L287.33,710.43 L287.33,710.44 L287.32,710.45 L287.32,710.46 L287.31,710.47 L287.31,710.48 L287.3,710.49 L287.29,710.5 L287.29,710.51 L287.28,710.51 L287.28,710.51 L287.27,710.52 L287.27,710.52 L287.26,710.52 L287.26,710.52 L287.25,710.53 L287.25,710.53 L287.24,710.53 L287.24,710.53 L287.23,710.54 L287.22,710.54 L287.22,710.54 L287.21,710.54 L287.2,710.54 L287.2,710.54 L287.19,710.54 L287.18,710.54 C287.01,710.54,287.01,710.38,287.01,710.27 V703.86 C287.01,703.76,287.01,703.59,287.17,703.59 C287.35,703.59,287.35,703.75,287.35,703.86 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4766" />
+<path
+   d="M291.9,709.62 L291.9,709.89 L291.89,710.18 L291.87,710.47 L291.84,710.78 L291.8,711.09 L291.75,711.41 L291.69,711.74 L291.61,712.07 L291.57,712.24 L291.52,712.4 L291.47,712.57 L291.41,712.74 L291.35,712.91 L291.29,713.07 L291.22,713.24 L291.14,713.41 L291.06,713.58 L290.98,713.74 L290.88,713.91 L290.79,714.07 L290.69,714.24 L290.58,714.4 L290.47,714.56 L290.35,714.72 C290.25,714.84,289.6,715.59,289.42,715.59 C289.37,715.59,289.3,715.57,289.3,715.49 C289.3,715.45,289.32,715.42,289.36,715.39 C289.84,714.88,290.49,714.07,290.9,712.49 C291.12,711.58,291.21,710.56,291.21,709.63 C291.21,708.63,291.12,707.61,290.87,706.64 C290.49,705.24,289.9,704.45,289.39,703.89 C289.3,703.8,289.3,703.78,289.3,703.76 C289.3,703.68,289.37,703.66,289.42,703.66 C289.57,703.66,290.12,704.27,290.24,704.41 C291.25,705.61,291.9,707.4,291.9,709.62 Z "
+   stroke-width="0"
+   fill="black"
+   id="path4768" />
+</g>    <g
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       ns0:preamble=""
+       ns0:text="$\\mathtt{jump}\\left(L_2, K_1, \\cdots, K_{|K|}\\right)$"
+       text-anchor="start"
+       word-spacing="normal"
+       letter-spacing="normal"
+       font-size-adjust="none"
+       font-stretch="normal"
+       font-weight="normal"
+       font-variant="normal"
+       font-style="normal"
+       fill-opacity="1"
+       fill-rule="evenodd"
+       fill="none"
+       stroke-opacity="1"
+       stroke-dashoffset="0"
+       stroke-dasharray="none"
+       stroke-miterlimit="10.433"
+       stroke-linejoin="miter"
+       stroke-linecap="butt"
+       stroke="black"
+       xml:space="preserve"
+       transform="matrix(1,0,0,-1,-194.71652,1192.6814)"
+       id="g5088">
+<path
+   id="path5090"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,711.01 L227.1,711.03 L227.1,711.06 L227.1,711.09 L227.1,711.11 L227.09,711.14 L227.09,711.16 L227.09,711.18 L227.09,711.2 L227.08,711.22 L227.08,711.24 L227.07,711.25 L227.06,711.27 L227.06,711.29 L227.05,711.3 L227.04,711.31 L227.03,711.33 L227.02,711.34 L227,711.35 L226.99,711.36 L226.98,711.37 L226.96,711.37 L226.94,711.38 L226.93,711.39 L226.91,711.39 L226.89,711.4 L226.86,711.4 L226.84,711.41 L226.82,711.41 L226.79,711.41 L226.76,711.41 L226.73,711.41 L226.72,711.41 L226.7,711.41 H225.13 C224.97,711.41,224.72,711.41,224.72,711.11 C224.72,710.81,224.97,710.81,225.12,710.81 H226.41 V706.74 C226.41,706.57,226.41,706.19,226.15,705.84 C225.88,705.46,225.57,705.46,225.35,705.46 C225.06,705.46,224.94,705.48,224.79,705.5 C224.8,705.53,224.8,705.55,224.8,705.62 C224.8,705.9,224.57,706.07,224.36,706.07 C224.13,706.07,223.91,705.9,223.91,705.61 C223.91,704.86,224.89,704.86,225.3,704.86 C226.74,704.86,227.1,706.05,227.1,706.69 Z " />
+<path
+   id="path5092"
+   fill="black"
+   stroke-width="0"
+   d="M227.1,712.72 L227.1,712.74 L227.1,712.77 L227.09,712.79 L227.09,712.82 L227.08,712.84 L227.08,712.87 L227.07,712.89 L227.06,712.91 L227.05,712.94 L227.04,712.96 L227.03,712.98 L227.02,713 L227,713.02 L226.99,713.04 L226.97,713.05 L226.96,713.07 L226.94,713.09 L226.92,713.1 L226.9,713.12 L226.88,713.13 L226.86,713.14 L226.84,713.16 L226.82,713.17 L226.8,713.18 L226.77,713.19 L226.75,713.19 L226.73,713.2 L226.7,713.21 L226.68,713.21 L226.65,713.21 L226.63,713.22 L226.6,713.22 C226.32,713.22,226.1,713,226.1,712.72 C226.1,712.44,226.32,712.22,226.6,712.22 C226.88,712.22,227.1,712.44,227.1,712.72 Z " />
+<path
+   id="path5094"
+   fill="black"
+   stroke-width="0"
+   d="M232.23,707.44 L232.23,707.43 L232.23,707.41 L232.23,707.4 L232.24,707.39 L232.24,707.37 L232.24,707.36 L232.24,707.35 L232.24,707.34 L232.25,707.33 L232.25,707.32 L232.25,707.31 L232.26,707.3 L232.26,707.29 L232.26,707.28 L232.27,707.27 L232.27,707.26 L232.28,707.25 L232.28,707.24 L232.29,707.24 L232.29,707.23 L232.3,707.21 L232.31,707.2 L232.33,707.19 L232.34,707.18 L232.35,707.17 L232.37,707.16 L232.38,707.16 L232.4,707.15 L232.41,707.15 L232.43,707.14 L232.44,707.14 L232.46,707.13 L232.48,707.13 L232.49,707.13 L232.51,707.13 L232.53,707.13 L232.56,707.13 L232.6,707.13 L232.63,707.12 H233.36 C233.52,707.12,233.77,707.12,233.77,707.43 C233.77,707.73,233.51,707.73,233.37,707.73 H232.92 V711.01 C232.92,711.32,232.86,711.41,232.52,711.41 H231.79 C231.63,711.41,231.38,711.41,231.38,711.11 C231.38,710.81,231.64,710.81,231.78,710.81 H232.23 V708.69 C232.23,707.79,231.42,707.67,231.1,707.67 C230.32,707.67,230.32,708,230.32,708.32 V711.01 C230.32,711.32,230.26,711.41,229.92,711.41 H229.19 C229.03,711.41,228.78,711.41,228.78,711.11 C228.78,710.81,229.04,710.81,229.18,710.81 H229.63 V708.26 C229.63,707.3,230.32,707.07,231.04,707.07 C231.45,707.07,231.86,707.16,232.23,707.44 Z " />
+<path
+   id="path5096"
+   fill="black"
+   stroke-width="0"
+   d="M234.98,711.12 L234.98,711.13 L234.98,711.14 L234.98,711.16 L234.97,711.17 L234.97,711.18 L234.97,711.19 L234.97,711.2 L234.96,711.21 L234.96,711.22 L234.96,711.24 L234.95,711.24 L234.95,711.25 L234.95,711.26 L234.94,711.27 L234.94,711.28 L234.93,711.29 L234.93,711.3 L234.92,711.3 L234.91,711.32 L234.9,711.33 L234.89,711.34 L234.88,711.35 L234.87,711.36 L234.85,711.37 L234.84,711.38 L234.83,711.38 L234.81,711.39 L234.8,711.39 L234.78,711.4 L234.76,711.4 L234.75,711.4 L234.73,711.41 L234.72,711.41 L234.7,711.41 L234.68,711.41 L234.65,711.41 L234.61,711.41 L234.58,711.41 H234.26 C234.11,711.41,233.85,711.41,233.85,711.12 C233.85,710.81,234.06,710.81,234.42,710.81 V707.73 C234.06,707.73,233.85,707.73,233.85,707.42 C233.85,707.12,234.12,707.12,234.26,707.12 H235.14 C235.29,707.12,235.55,707.12,235.55,707.42 C235.55,707.73,235.34,707.73,234.98,707.73 V709.51 C234.98,710.4,235.39,710.87,235.8,710.87 C236.03,710.87,236.16,710.7,236.16,710.05 V707.73 C235.98,707.73,235.73,707.73,235.73,707.42 C235.73,707.12,236,707.12,236.14,707.12 H236.88 C237.03,707.12,237.29,707.12,237.29,707.42 C237.29,707.73,237.08,707.73,236.72,707.73 V709.51 C236.72,710.4,237.13,710.87,237.54,710.87 C237.77,710.87,237.91,710.7,237.91,710.05 V707.73 C237.72,707.73,237.47,707.73,237.47,707.42 C237.47,707.12,237.74,707.12,237.88,707.12 H238.63 C238.78,707.12,239.04,707.12,239.04,707.42 C239.04,707.73,238.83,707.73,238.47,707.73 V710.14 C238.47,710.34,238.47,711.47,237.58,711.47 C237.28,711.47,236.87,711.34,236.59,710.96 C236.45,711.29,236.16,711.47,235.84,711.47 C235.52,711.47,235.22,711.34,234.98,711.12 Z " />
+<path
+   id="path5098"
+   fill="black"
+   stroke-width="0"
+   d="M240.78,707.57 L240.82,707.53 L240.85,707.5 L240.89,707.46 L240.93,707.43 L240.97,707.4 L241.01,707.37 L241.05,707.34 L241.09,707.32 L241.12,707.29 L241.16,707.27 L241.2,707.25 L241.24,707.23 L241.28,707.21 L241.31,707.19 L241.35,707.18 L241.39,707.16 L241.43,707.15 L241.46,707.14 L241.5,707.13 L241.54,707.12 L241.57,707.11 L241.61,707.1 L241.64,707.09 L241.68,707.09 L241.71,707.08 L241.74,707.08 L241.81,707.07 L241.87,707.07 L241.93,707.07 L241.9,707.67 C241.13,707.67,240.78,708.55,240.78,709.03 V709.75 C240.78,710.34,241.36,710.87,241.98,710.87 C242.72,710.87,243.3,710.14,243.3,709.28 C243.3,708.32,242.6,707.67,241.9,707.67 L241.93,707.07 C243.02,707.07,243.99,708.01,243.99,709.28 C243.99,710.5,243.1,711.47,242.04,711.47 C241.57,711.47,241.12,711.29,240.78,710.99 C240.78,711.28,240.76,711.41,240.38,711.41 H239.65 C239.49,711.41,239.24,711.41,239.24,711.11 C239.24,710.81,239.5,710.81,239.64,710.81 H240.09 V705.52 H239.65 C239.49,705.52,239.24,705.52,239.24,705.21 C239.24,704.92,239.5,704.92,239.64,704.92 H241.23 C241.37,704.92,241.62,704.92,241.62,705.21 C241.62,705.52,241.38,705.52,241.22,705.52 H240.78 Z " />
+<path
+   id="path5100"
+   fill="black"
+   stroke-width="0"
+   d="M250.13,703.76 L250.13,703.76 L250.13,703.77 L250.13,703.77 L250.13,703.77 L250.13,703.78 L250.13,703.78 L250.13,703.78 L250.13,703.79 L250.13,703.79 L250.13,703.79 L250.12,703.79 L250.12,703.8 L250.12,703.8 L250.12,703.8 L250.12,703.81 L250.12,703.81 L250.12,703.81 L250.11,703.82 L250.11,703.82 L250.11,703.83 L250.1,703.83 L250.1,703.84 L250.09,703.84 L250.09,703.85 C249.63,704.34,248.96,705.14,248.54,706.77 C248.31,707.67,248.22,708.7,248.22,709.62 C248.22,712.24,248.85,714.07,250.04,715.36 C250.13,715.45,250.13,715.47,250.13,715.49 C250.13,715.59,250.05,715.59,250.01,715.59 C249.86,715.59,249.32,715,249.19,714.85 C248.18,713.64,247.53,711.85,247.53,709.63 C247.53,708.22,247.78,706.22,249.08,704.54 C249.18,704.42,249.83,703.66,250.01,703.66 C250.05,703.66,250.13,703.66,250.13,703.76 Z " />
+<path
+   id="path5102"
+   fill="black"
+   stroke-width="0"
+   d="M254.31,713.15 L254.32,713.18 L254.32,713.21 L254.33,713.24 L254.34,713.27 L254.35,713.3 L254.36,713.32 L254.37,713.35 L254.38,713.37 L254.39,713.39 L254.4,713.41 L254.42,713.43 L254.43,713.45 L254.45,713.47 L254.47,713.49 L254.49,713.5 L254.52,713.51 L254.55,713.53 L254.58,713.54 L254.61,713.55 L254.64,713.56 L254.66,713.57 L254.68,713.57 L254.7,713.57 L254.72,713.58 L254.74,713.58 L254.77,713.59 L254.79,713.59 L254.82,713.59 L254.84,713.59 L254.87,713.6 L254.9,713.6 L254.93,713.6 L254.96,713.6 L254.99,713.61 L255.02,713.61 L255.05,713.61 L255.09,713.61 L255.12,713.61 L255.16,713.61 L255.2,713.61 L255.24,713.61 L255.28,713.61 L255.32,713.61 L255.37,713.61 C255.66,713.61,255.74,713.61,255.74,713.8 C255.74,713.92,255.63,713.92,255.58,713.92 C255.26,713.92,254.44,713.89,254.11,713.89 C253.81,713.89,253.08,713.92,252.78,713.92 C252.71,713.92,252.59,713.92,252.59,713.72 C252.59,713.61,252.68,713.61,252.87,713.61 C252.89,713.61,253.08,713.61,253.25,713.59 C253.43,713.57,253.52,713.56,253.52,713.43 C253.52,713.4,253.51,713.36,253.48,713.25 L252.15,707.9 C252.04,707.51,252.02,707.43,251.24,707.43 C251.07,707.43,250.97,707.43,250.97,707.23 C250.97,707.12,251.06,707.12,251.24,707.12 H255.85 C256.09,707.12,256.1,707.12,256.16,707.29 L256.95,709.44 C256.99,709.55,256.99,709.57,256.99,709.58 C256.99,709.62,256.96,709.69,256.87,709.69 C256.78,709.69,256.77,709.64,256.7,709.48 C256.36,708.57,255.92,707.43,254.2,707.43 H253.26 C253.12,707.43,253.1,707.43,253.04,707.44 C252.94,707.45,252.91,707.46,252.91,707.54 C252.91,707.57,252.91,707.59,252.96,707.77 Z " />
+<path
+   id="path5104"
+   fill="black"
+   stroke-width="0"
+   d="M260.88,706.9 H260.64 C260.62,706.74,260.55,706.33,260.46,706.26 C260.4,706.22,259.87,706.22,259.77,706.22 H258.49 C259.22,706.87,259.46,707.06,259.88,707.39 C260.4,707.8,260.88,708.23,260.88,708.89 C260.88,709.73,260.14,710.25,259.25,710.25 C258.38,710.25,257.8,709.64,257.8,709 C257.8,708.65,258.1,708.61,258.17,708.61 C258.33,708.61,258.54,708.73,258.54,708.98 C258.54,709.11,258.49,709.35,258.13,709.35 C258.34,709.84,258.82,710,259.14,710 C259.84,710,260.2,709.46,260.2,708.89 C260.2,708.29,259.77,707.81,259.55,707.56 L257.87,705.9 C257.8,705.84,257.8,705.83,257.8,705.63 H260.67 Z " />
+<path
+   id="path5106"
+   fill="black"
+   stroke-width="0"
+   d="M263.85,707.14 L263.85,707.2 L263.85,707.26 L263.85,707.31 L263.84,707.37 L263.84,707.42 L263.83,707.48 L263.82,707.53 L263.81,707.58 L263.8,707.62 L263.78,707.67 L263.77,707.71 L263.75,707.75 L263.74,707.79 L263.72,707.83 L263.7,707.87 L263.68,707.9 L263.66,707.94 L263.64,707.97 L263.61,708 L263.59,708.02 L263.56,708.05 L263.54,708.07 L263.51,708.09 L263.48,708.11 L263.45,708.13 L263.42,708.14 L263.39,708.15 L263.35,708.16 L263.32,708.17 L263.29,708.18 L263.25,708.18 L263.22,708.18 C262.89,708.18,262.69,707.93,262.69,707.65 C262.69,707.38,262.89,707.12,263.22,707.12 C263.33,707.12,263.46,707.16,263.57,707.25 C263.59,707.27,263.6,707.28,263.61,707.28 C263.62,707.28,263.63,707.27,263.63,707.14 C263.63,706.4,263.29,705.8,262.96,705.47 C262.85,705.36,262.85,705.34,262.85,705.31 C262.85,705.24,262.9,705.2,262.95,705.2 C263.06,705.2,263.85,705.97,263.85,707.14 Z " />
+<path
+   id="path5108"
+   fill="black"
+   stroke-width="0"
+   d="M271.33,711.15 L271.33,711.15 L271.33,711.15 L271.33,711.16 L271.33,711.16 L271.33,711.16 L271.33,711.17 L271.32,711.17 L271.32,711.18 L271.32,711.18 L271.32,711.19 L271.32,711.19 L271.31,711.2 L271.31,711.21 L271.31,711.22 L271.3,711.23 L271.3,711.24 L271.3,711.24 L271.29,711.25 L271.29,711.25 L271.29,711.25 L271.29,711.26 L271.29,711.26 L271.29,711.27 L271.29,711.27 L271.29,711.28 L271.29,711.28 L271.29,711.28 L271.29,711.28 C271.29,711.29,271.46,711.43,271.58,711.51 L273.32,712.86 C274.26,713.54,274.64,713.58,274.94,713.61 C275.02,713.62,275.12,713.63,275.12,713.81 C275.12,713.85,275.09,713.92,275.01,713.92 C274.79,713.92,274.55,713.89,274.31,713.89 C273.95,713.89,273.56,713.92,273.2,713.92 C273.13,713.92,273.01,713.92,273.01,713.72 C273.01,713.65,273.06,713.62,273.13,713.61 C273.35,713.59,273.44,713.54,273.44,713.41 C273.44,713.23,273.14,713,273.08,712.95 L269.19,709.96 L269.99,713.16 C270.08,713.52,270.1,713.61,270.83,713.61 C271.08,713.61,271.17,713.61,271.17,713.81 C271.17,713.9,271.09,713.92,271.03,713.92 C270.75,713.92,270.03,713.89,269.75,713.89 C269.46,713.89,268.75,713.92,268.46,713.92 C268.39,713.92,268.27,713.92,268.27,713.73 C268.27,713.61,268.36,713.61,268.55,713.61 C268.68,713.61,268.86,713.6,268.98,713.59 C269.14,713.57,269.2,713.54,269.2,713.43 C269.2,713.4,269.19,713.36,269.16,713.25 L267.83,707.9 C267.73,707.51,267.71,707.43,266.92,707.43 C266.75,707.43,266.64,707.43,266.64,707.24 C266.64,707.12,266.76,707.12,266.79,707.12 C267.07,707.12,267.78,707.16,268.06,707.16 C268.27,707.16,268.48,707.15,268.69,707.15 C268.91,707.15,269.13,707.12,269.34,707.12 C269.41,707.12,269.54,707.12,269.54,707.32 C269.54,707.43,269.45,707.43,269.26,707.43 C268.89,707.43,268.61,707.43,268.61,707.61 C268.61,707.68,268.67,707.9,268.7,708.05 C268.84,708.57,268.97,709.1,269.1,709.61 L270.59,710.77 L271.74,708.09 C271.86,707.82,271.86,707.8,271.86,707.74 C271.86,707.44,271.43,707.43,271.35,707.43 C271.24,707.43,271.13,707.43,271.13,707.23 C271.13,707.12,271.25,707.12,271.27,707.12 C271.66,707.12,272.08,707.16,272.48,707.16 C272.7,707.16,273.24,707.12,273.46,707.12 C273.51,707.12,273.64,707.12,273.64,707.32 C273.64,707.43,273.53,707.43,273.44,707.43 C273.03,707.44,272.9,707.53,272.75,707.88 Z " />
+<path
+   id="path5110"
+   fill="black"
+   stroke-width="0"
+   d="M277.05,710.05 L277.05,710.06 L277.05,710.07 L277.05,710.08 L277.05,710.09 L277.05,710.09 L277.05,710.1 L277.05,710.11 L277.05,710.12 L277.05,710.12 L277.05,710.13 L277.05,710.13 L277.05,710.14 L277.05,710.15 L277.05,710.15 L277.05,710.16 L277.05,710.16 L277.05,710.17 L277.04,710.17 L277.04,710.18 L277.04,710.19 L277.04,710.2 L277.03,710.2 L277.03,710.21 L277.03,710.22 L277.02,710.22 L277.02,710.23 L277.01,710.23 L277,710.23 L276.99,710.24 L276.99,710.24 L276.98,710.24 L276.97,710.24 L276.96,710.24 L276.96,710.24 L276.95,710.24 L276.95,710.25 L276.94,710.25 L276.93,710.25 L276.93,710.25 L276.92,710.25 L276.91,710.25 L276.91,710.25 L276.9,710.25 L276.89,710.25 L276.89,710.25 L276.88,710.25 L276.87,710.25 L276.86,710.25 L276.85,710.25 L276.84,710.25 C276.4,709.81,275.76,709.8,275.48,709.8 V709.55 C275.64,709.55,276.11,709.55,276.49,709.75 V706.2 C276.49,705.97,276.49,705.88,275.79,705.88 H275.53 V705.63 C275.65,705.64,276.51,705.66,276.77,705.66 C276.98,705.66,277.86,705.64,278.01,705.63 V705.88 H277.75 C277.05,705.88,277.05,705.97,277.05,706.2 Z " />
+<path
+   id="path5112"
+   fill="black"
+   stroke-width="0"
+   d="M281.21,707.14 L281.21,707.2 L281.21,707.26 L281.21,707.31 L281.2,707.37 L281.19,707.42 L281.19,707.48 L281.18,707.53 L281.17,707.58 L281.16,707.62 L281.14,707.67 L281.13,707.71 L281.11,707.75 L281.1,707.79 L281.08,707.83 L281.06,707.87 L281.04,707.9 L281.02,707.94 L280.99,707.97 L280.97,708 L280.95,708.02 L280.92,708.05 L280.89,708.07 L280.87,708.09 L280.84,708.11 L280.81,708.13 L280.78,708.14 L280.75,708.15 L280.71,708.16 L280.68,708.17 L280.65,708.18 L280.61,708.18 L280.57,708.18 C280.24,708.18,280.05,707.93,280.05,707.65 C280.05,707.38,280.24,707.12,280.57,707.12 C280.69,707.12,280.82,707.16,280.92,707.25 C280.95,707.27,280.96,707.28,280.97,707.28 C280.98,707.28,280.99,707.27,280.99,707.14 C280.99,706.4,280.64,705.8,280.31,705.47 C280.2,705.36,280.2,705.34,280.2,705.31 C280.2,705.24,280.26,705.2,280.3,705.2 C280.41,705.2,281.21,705.97,281.21,707.14 Z " />
+<path
+   id="path5114"
+   fill="black"
+   stroke-width="0"
+   d="M285.53,709.61 L285.53,709.64 L285.53,709.67 L285.52,709.69 L285.52,709.72 L285.51,709.74 L285.51,709.77 L285.5,709.79 L285.49,709.82 L285.48,709.84 L285.47,709.86 L285.45,709.89 L285.44,709.91 L285.42,709.93 L285.41,709.95 L285.39,709.97 L285.37,709.99 L285.36,710 L285.34,710.02 L285.32,710.04 L285.3,710.05 L285.27,710.06 L285.25,710.08 L285.23,710.09 L285.21,710.1 L285.18,710.11 L285.16,710.12 L285.13,710.12 L285.11,710.13 L285.08,710.13 L285.06,710.14 L285.03,710.14 L285,710.14 C284.71,710.14,284.47,709.9,284.47,709.61 C284.47,709.32,284.71,709.09,285,709.09 C285.29,709.09,285.53,709.32,285.53,709.61 Z " />
+<path
+   id="path5116"
+   fill="black"
+   stroke-width="0"
+   d="M289.96,709.61 L289.96,709.64 L289.96,709.67 L289.95,709.69 L289.95,709.72 L289.94,709.74 L289.94,709.77 L289.93,709.79 L289.92,709.82 L289.91,709.84 L289.9,709.86 L289.88,709.89 L289.87,709.91 L289.86,709.93 L289.84,709.95 L289.82,709.97 L289.81,709.99 L289.79,710 L289.77,710.02 L289.75,710.04 L289.73,710.05 L289.71,710.06 L289.68,710.08 L289.66,710.09 L289.64,710.1 L289.61,710.11 L289.59,710.12 L289.56,710.12 L289.54,710.13 L289.51,710.13 L289.49,710.14 L289.46,710.14 L289.43,710.14 C289.14,710.14,288.9,709.9,288.9,709.61 C288.9,709.32,289.14,709.09,289.43,709.09 C289.72,709.09,289.96,709.32,289.96,709.61 Z " />
+<path
+   id="path5118"
+   fill="black"
+   stroke-width="0"
+   d="M294.38,709.61 L294.38,709.64 L294.38,709.67 L294.38,709.69 L294.37,709.72 L294.37,709.74 L294.36,709.77 L294.35,709.79 L294.34,709.82 L294.33,709.84 L294.32,709.86 L294.31,709.89 L294.29,709.91 L294.28,709.93 L294.26,709.95 L294.24,709.97 L294.23,709.99 L294.21,710 L294.19,710.02 L294.17,710.04 L294.15,710.05 L294.13,710.06 L294.1,710.08 L294.08,710.09 L294.06,710.1 L294.03,710.11 L294.01,710.12 L293.99,710.12 L293.96,710.13 L293.93,710.13 L293.91,710.14 L293.88,710.14 L293.85,710.14 C293.57,710.14,293.33,709.9,293.33,709.61 C293.33,709.32,293.57,709.09,293.85,709.09 C294.14,709.09,294.38,709.32,294.38,709.61 Z " />
+<path
+   id="path5120"
+   fill="black"
+   stroke-width="0"
+   d="M298.92,707.14 L298.92,707.2 L298.92,707.26 L298.92,707.31 L298.91,707.37 L298.91,707.42 L298.9,707.48 L298.89,707.53 L298.88,707.58 L298.87,707.62 L298.85,707.67 L298.84,707.71 L298.82,707.75 L298.81,707.79 L298.79,707.83 L298.77,707.87 L298.75,707.9 L298.73,707.94 L298.71,707.97 L298.68,708 L298.66,708.02 L298.63,708.05 L298.6,708.07 L298.58,708.09 L298.55,708.11 L298.52,708.13 L298.49,708.14 L298.46,708.15 L298.42,708.16 L298.39,708.17 L298.36,708.18 L298.32,708.18 L298.29,708.18 C297.96,708.18,297.76,707.93,297.76,707.65 C297.76,707.38,297.96,707.12,298.29,707.12 C298.4,707.12,298.53,707.16,298.63,707.25 C298.66,707.27,298.67,707.28,298.68,707.28 C298.69,707.28,298.7,707.27,298.7,707.14 C298.7,706.4,298.35,705.8,298.02,705.47 C297.92,705.36,297.92,705.34,297.92,705.31 C297.92,705.24,297.97,705.2,298.02,705.2 C298.12,705.2,298.92,705.97,298.92,707.14 Z " />
+<path
+   id="path5122"
+   fill="black"
+   stroke-width="0"
+   d="M306.4,711.15 L306.4,711.15 L306.4,711.15 L306.4,711.16 L306.4,711.16 L306.4,711.16 L306.4,711.17 L306.39,711.17 L306.39,711.18 L306.39,711.18 L306.39,711.19 L306.39,711.19 L306.38,711.2 L306.38,711.21 L306.38,711.22 L306.37,711.23 L306.37,711.24 L306.37,711.24 L306.36,711.25 L306.36,711.25 L306.36,711.25 L306.36,711.26 L306.36,711.26 L306.36,711.27 L306.36,711.27 L306.36,711.28 L306.35,711.28 L306.35,711.28 L306.35,711.28 C306.35,711.29,306.53,711.43,306.64,711.51 L308.39,712.86 C309.33,713.54,309.71,713.58,310.01,713.61 C310.09,713.62,310.19,713.63,310.19,713.81 C310.19,713.85,310.16,713.92,310.08,713.92 C309.86,713.92,309.61,713.89,309.38,713.89 C309.02,713.89,308.63,713.92,308.27,713.92 C308.2,713.92,308.08,713.92,308.08,713.72 C308.08,713.65,308.13,713.62,308.2,713.61 C308.42,713.59,308.51,713.54,308.51,713.41 C308.51,713.23,308.21,713,308.15,712.95 L304.26,709.96 L305.06,713.16 C305.15,713.52,305.17,713.61,305.9,713.61 C306.14,713.61,306.23,713.61,306.23,713.81 C306.23,713.9,306.15,713.92,306.1,713.92 C305.82,713.92,305.1,713.89,304.82,713.89 C304.53,713.89,303.82,713.92,303.53,713.92 C303.46,713.92,303.33,713.92,303.33,713.73 C303.33,713.61,303.42,713.61,303.62,713.61 C303.75,713.61,303.93,713.6,304.05,713.59 C304.21,713.57,304.27,713.54,304.27,713.43 C304.27,713.4,304.26,713.36,304.23,713.25 L302.89,707.9 C302.8,707.51,302.78,707.43,301.99,707.43 C301.82,707.43,301.71,707.43,301.71,707.24 C301.71,707.12,301.83,707.12,301.86,707.12 C302.14,707.12,302.85,707.16,303.12,707.16 C303.33,707.16,303.55,707.15,303.76,707.15 C303.98,707.15,304.2,707.12,304.41,707.12 C304.48,707.12,304.61,707.12,304.61,707.32 C304.61,707.43,304.52,707.43,304.33,707.43 C303.96,707.43,303.68,707.43,303.68,707.61 C303.68,707.68,303.74,707.9,303.77,708.05 C303.91,708.57,304.04,709.1,304.17,709.61 L305.66,710.77 L306.81,708.09 C306.93,707.82,306.93,707.8,306.93,707.74 C306.93,707.44,306.5,707.43,306.41,707.43 C306.3,707.43,306.2,707.43,306.2,707.23 C306.2,707.12,306.32,707.12,306.33,707.12 C306.73,707.12,307.15,707.16,307.55,707.16 C307.77,707.16,308.31,707.12,308.53,707.12 C308.58,707.12,308.71,707.12,308.71,707.32 C308.71,707.43,308.6,707.43,308.51,707.43 C308.1,707.44,307.97,707.53,307.82,707.88 Z " />
+<path
+   id="path5124"
+   fill="black"
+   stroke-width="0"
+   d="M311.14,710.27 L311.14,710.28 L311.14,710.29 L311.14,710.3 L311.14,710.31 L311.14,710.33 L311.14,710.34 L311.14,710.36 L311.14,710.37 L311.13,710.38 L311.13,710.39 L311.13,710.4 L311.13,710.41 L311.13,710.42 L311.12,710.43 L311.12,710.44 L311.11,710.45 L311.11,710.46 L311.1,710.47 L311.1,710.48 L311.09,710.49 L311.08,710.5 L311.08,710.51 L311.07,710.51 L311.07,710.51 L311.06,710.52 L311.06,710.52 L311.05,710.52 L311.05,710.52 L311.04,710.53 L311.04,710.53 L311.03,710.53 L311.03,710.53 L311.02,710.54 L311.01,710.54 L311.01,710.54 L311,710.54 L310.99,710.54 L310.99,710.54 L310.98,710.54 L310.97,710.54 C310.8,710.54,310.8,710.38,310.8,710.27 V703.86 C310.8,703.76,310.8,703.59,310.96,703.59 C311.14,703.59,311.14,703.75,311.14,703.86 Z " />
+<path
+   id="path5126"
+   fill="black"
+   stroke-width="0"
+   d="M316.14,708.12 L316.14,708.13 L316.13,708.13 L316.13,708.14 L316.13,708.14 L316.13,708.14 L316.12,708.15 L316.12,708.15 L316.12,708.16 L316.12,708.16 L316.12,708.16 L316.12,708.17 L316.11,708.17 L316.11,708.17 L316.11,708.18 L316.11,708.18 L316.11,708.18 L316.11,708.18 L316.11,708.19 L316.1,708.19 L316.1,708.19 L316.1,708.19 L316.1,708.19 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.2 L316.1,708.21 C316.1,708.22,316.1,708.23,316.26,708.34 L316.97,708.83 C317.89,709.48,318.32,709.78,318.81,709.83 C318.89,709.83,318.97,709.84,318.97,709.98 C318.97,710.03,318.92,710.07,318.88,710.07 C318.74,710.07,318.55,710.05,318.4,710.05 C318.21,710.05,317.75,710.08,317.56,710.08 C317.52,710.08,317.41,710.08,317.41,709.92 C317.41,709.91,317.41,709.83,317.52,709.83 C317.6,709.82,317.69,709.8,317.69,709.73 C317.69,709.6,317.48,709.45,317.39,709.39 L314.48,707.34 L315.03,709.53 C315.09,709.77,315.1,709.83,315.64,709.83 C315.76,709.83,315.85,709.83,315.85,709.97 C315.85,710.03,315.81,710.08,315.74,710.08 C315.54,710.08,315.03,710.05,314.83,710.05 C314.71,710.05,314.47,710.05,314.35,710.05 C314.21,710.06,314.04,710.08,313.91,710.08 C313.87,710.08,313.76,710.08,313.76,709.92 C313.76,709.83,313.84,709.83,313.99,709.83 C314.11,709.83,314.13,709.83,314.26,709.81 C314.4,709.8,314.41,709.78,314.41,709.71 C314.41,709.7,314.41,709.66,314.38,709.56 L313.46,705.87 C313.4,705.63,313.39,705.58,312.85,705.58 C312.72,705.58,312.64,705.58,312.64,705.42 C312.64,705.42,312.64,705.33,312.75,705.33 C312.95,705.33,313.45,705.35,313.65,705.35 C313.77,705.35,314.02,705.35,314.13,705.35 C314.27,705.34,314.45,705.33,314.58,705.33 C314.62,705.33,314.73,705.33,314.73,705.48 C314.73,705.58,314.64,705.58,314.5,705.58 C314.49,705.58,314.36,705.58,314.24,705.59 C314.08,705.6,314.08,705.62,314.08,705.7 C314.08,705.75,314.15,706.01,314.4,707.03 L315.56,707.84 L316.57,705.89 C316.62,705.8,316.62,705.79,316.62,705.76 C316.62,705.6,316.42,705.58,316.3,705.58 C316.21,705.58,316.12,705.58,316.12,705.42 C316.12,705.42,316.12,705.33,316.24,705.33 C316.43,705.33,316.93,705.35,317.13,705.35 C317.34,705.35,317.61,705.33,317.81,705.33 C317.9,705.33,317.95,705.38,317.95,705.47 C317.95,705.58,317.86,705.58,317.79,705.58 C317.66,705.58,317.45,705.58,317.33,705.81 Z " />
+<path
+   id="path5128"
+   fill="black"
+   stroke-width="0"
+   d="M320.69,710.27 L320.69,710.28 L320.69,710.29 L320.69,710.3 L320.69,710.31 L320.69,710.33 L320.69,710.34 L320.69,710.36 L320.68,710.37 L320.68,710.38 L320.68,710.39 L320.68,710.4 L320.68,710.41 L320.67,710.42 L320.67,710.43 L320.67,710.44 L320.66,710.45 L320.66,710.46 L320.65,710.47 L320.65,710.48 L320.64,710.49 L320.63,710.5 L320.63,710.51 L320.62,710.51 L320.62,710.51 L320.61,710.52 L320.61,710.52 L320.6,710.52 L320.6,710.52 L320.59,710.53 L320.59,710.53 L320.58,710.53 L320.58,710.53 L320.57,710.54 L320.56,710.54 L320.56,710.54 L320.55,710.54 L320.54,710.54 L320.54,710.54 L320.53,710.54 L320.52,710.54 C320.35,710.54,320.35,710.38,320.35,710.27 V703.86 C320.35,703.76,320.35,703.59,320.51,703.59 C320.69,703.59,320.69,703.75,320.69,703.86 Z " />
+<path
+   id="path5130"
+   fill="black"
+   stroke-width="0"
+   d="M325.24,709.62 L325.24,709.89 L325.23,710.18 L325.21,710.47 L325.18,710.78 L325.14,711.09 L325.09,711.41 L325.03,711.74 L324.95,712.07 L324.91,712.24 L324.86,712.4 L324.81,712.57 L324.75,712.74 L324.69,712.91 L324.63,713.07 L324.56,713.24 L324.48,713.41 L324.4,713.58 L324.32,713.74 L324.22,713.91 L324.13,714.07 L324.03,714.24 L323.92,714.4 L323.81,714.56 L323.69,714.72 C323.59,714.84,322.94,715.59,322.76,715.59 C322.71,715.59,322.64,715.57,322.64,715.49 C322.64,715.45,322.66,715.42,322.7,715.39 C323.18,714.88,323.83,714.07,324.24,712.49 C324.46,711.58,324.55,710.56,324.55,709.63 C324.55,708.63,324.46,707.61,324.21,706.64 C323.83,705.24,323.24,704.45,322.73,703.89 C322.64,703.8,322.64,703.78,322.64,703.76 C322.64,703.68,322.71,703.66,322.76,703.66 C322.91,703.66,323.46,704.27,323.58,704.41 C324.59,705.61,325.24,707.4,325.24,709.62 Z " />
+</g>  </g>
+</svg>
diff --git a/talk/iwtc11/paper.bib b/talk/iwtc11/paper.bib
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/paper.bib
@@ -0,0 +1,339 @@
+
+ at inproceedings{deutsch_efficient_1984,
+	address = {Salt Lake City, Utah},
+	title = {Efficient implementation of the Smalltalk-80 system},
+	isbn = {0-89791-125-3},
+	url = {http://portal.acm.org/citation.cfm?id=800017.800542},
+	doi = {10.1145/800017.800542},
+	abstract = {The Smalltalk-80* programming language includes dynamic storage allocation, full upward funargs, and universally polymorphic procedures; the Smalltalk-80 programming system features interactive execution with incremental compilation, and implementation portability. These features of modern programming systems are among the most difficult to implement efficiently, even individually. A new implementation of the Smalltalk-80 system, hosted on a small microprocessor-based computer, achieves high performance while retaining complete (object code) compatibility with existing implementations. This paper discusses the most significant optimization techniques developed over the course of the project, many of which are applicable to other languages. The key idea is to represent certain runtime state (both code and data) in more than one form, and to convert between forms when needed.},
+	booktitle = {{POPL}},
+	publisher = {{ACM}},
+	author = {Deutsch, L. Peter and Schiffman, Allan M.},
+	year = {1984}
+},
+
+ at inproceedings{carl_friedrich_bolz_towards_2010,
+	address = {Hagenberg, Austria},
+	title = {Towards a Jitting {VM} for Prolog execution},
+	isbn = {978-1-4503-0132-9},
+	url = {http://portal.acm.org/citation.cfm?id=1836102},
+	doi = {10.1145/1836089.1836102},
+	abstract = {Most Prolog implementations are implemented in low-level languages such as C and are based on a variation of the {WAM} instruction set, which enhances their performance but makes them hard to write. In addition, many of the more dynamic features of Prolog (like assert), despite their popularity, are not well supported. We present a high-level continuation-based Prolog interpreter based on the {PyPy} project. The {PyPy} project makes it possible to easily and efficiently implement dynamic languages. It provides tools that automatically generate a just-in-time compiler for a given interpreter of the target language, by using partial evaluation techniques. The resulting Prolog implementation is surprisingly efficient: it clearly outperforms existing interpreters of Prolog in high-level languages such as Java. Moreover, on some benchmarks, our system outperforms state-of-the-art {WAM-based} Prolog implementations. Our paper aims to show that declarative languages such as Prolog can indeed benefit from having a just-in-time compiler and that {PyPy} can form the basis for implementing programming languages other than Python.},
+	booktitle = {{PPDP}},
+	publisher = {{ACM}},
+	author = {Carl Friedrich Bolz and Michael Leuschel and David Schneider},
+	year = {2010},
+	keywords = {interpreters, jit, logic programming, partial evaluation}
+},
+
+ at inproceedings{bebenita_spur:_2010,
+	address = {{Reno/Tahoe}, Nevada, {USA}},
+	title = {{SPUR:} a trace-based {JIT} compiler for {CIL}},
+	isbn = {978-1-4503-0203-6},
+	shorttitle = {{SPUR}},
+	url = {http://portal.acm.org/citation.cfm?id=1869459.1869517&coll=GUIDE&dl=GUIDE&type=series&idx=SERIES318&part=series&WantType=Proceedings&title=OOPSLA%2FSPLASH&CFID=106280261&CFTOKEN=29377718},
+	doi = {10.1145/1869459.1869517},
+	abstract = {Tracing just-in-time compilers {(TJITs)} determine frequently executed traces (hot paths and loops) in running programs and focus their optimization effort by emitting optimized machine code specialized to these traces. Prior work has established this strategy to be especially beneficial for dynamic languages such as {JavaScript}, where the {TJIT} interfaces with the interpreter and produces machine code from the {JavaScript} trace.},
+	booktitle = {{OOPSLA}},
+	publisher = {{ACM}},
+	author = {Bebenita, Michael and Brandner, Florian and Fahndrich, Manuel and Logozzo, Francesco and Schulte, Wolfram and Tillmann, Nikolai and Venter, Herman},
+	year = {2010},
+	keywords = {cil, dynamic compilation, javascript, just-in-time, tracing}
+},
+
+ at inproceedings{gal_trace-based_2009,
+	address = {New York, New York},
+	series = {{PLDI} '09},
+	title = {Trace-based just-in-time type specialization for dynamic languages},
+	isbn = {978-1-60558-392-1},
+	location = {Dublin, Ireland},
+	doi = {10.1145/1542476.1542528},
+	abstract = {Dynamic languages such as {JavaScript} are more difficult to compile than statically typed ones. Since no concrete type information is available, traditional compilers need to emit generic code that can handle all possible type combinations at runtime. We present an alternative compilation technique for dynamically-typed languages that identifies frequently executed loop traces at run-time and then generates machine code on the fly that is specialized for the actual dynamic types occurring on each path through the loop. Our method provides cheap inter-procedural type specialization, and an elegant and efficient way of incrementally compiling lazily discovered alternative paths through nested loops. We have implemented a dynamic compiler for {JavaScript} based on our technique and we have measured speedups of 10x and more for certain benchmark programs.},
+	booktitle = {{PLDI}},
+	publisher = {{ACM}},
+	author = {Gal, Andreas and Eich, Brendan and Shaver, Mike and Anderson, David and Mandelin, David and Haghighat, Mohammad R and Kaplan, Blake and Hoare, Graydon and Zbarsky, Boris and Orendorff, Jason and Ruderman, Jesse and Smith, Edwin W and Reitmaier, Rick and Bebenita, Michael and Chang, Mason and Franz, Michael},
+	year = {2009},
+	note = {{ACM} {ID:} 1542528},
+	keywords = {code generation, design, dynamically typed languages, experimentation, incremental compilers, languages, measurement, performance, run-time environments, trace-based compilation}
+},
+
+ at inproceedings{bolz_towards_2009,
+	title = {Towards {Just-In-Time} Partial Evaluation of Prolog},
+	doi = {10.1007/978-3-642-12592-8_12},
+	booktitle = {Logic Program Synthesis and Transformation},
+	author = {Bolz, Carl Friedrich and Leuschel, Michael and Rigo, Armin},
+	year = {2009},
+	pages = {158&#8211;172}
+},
+
+ at inproceedings{bolz_allocation_2011,
+	address = {Austin, Texas, {USA}},
+	title = {Allocation removal by partial evaluation in a tracing {JIT}},
+	abstract = {The performance of many dynamic language implementations suffers from high allocation rates and runtime type checks. This makes dynamic languages less applicable to purely algorithmic problems, despite their growing popularity. In this paper we present a simple compiler optimization based on online partial evaluation to remove object allocations and runtime type checks in the context of a tracing {JIT.} We evaluate the optimization using a Python {VM} and find that it gives good results for all our (real-life) benchmarks.},
+	booktitle = {{PEPM}},
+	author = {Bolz, Carl Friedrich and Cuni, Antonio and Fija&#322;kowski, Maciej and Leuschel, Michael and Pedroni, Samuele and Rigo, Armin},
+	year = {2011},
+	keywords = {code generation, experimentation, interpreters, languages, optimization, partial evaluation, performance, run-time environments, tracing jit}
+},
+
+ at article{hiniker_improving_2005,
+	series = {{MICRO} 38},
+	title = {Improving Region Selection in Dynamic Optimization Systems},
+	location = {Barcelona, Spain},
+	url = {http://dx.doi.org/10.1109/MICRO.2005.22},
+	doi = {http://dx.doi.org/10.1109/MICRO.2005.22},
+	abstract = {The performance of a dynamic optimization system depends heavily on the code it selects to optimize. Many current systems follow the design of {HP} Dynamo and select a single interprocedural path, or trace, as the unit of code optimization and code caching. Though this approach to region selection has worked well in practice, we show that it is possible to adapt this basic approach to produce regions with greater locality, less needless code duplication, and fewer profiling counters. In particular, we propose two new region-selection algorithms and evaluate them against Dynamo&#191;s selection mechanism, {Next-Executing} Tail {(NET).} Our first algorithm, {Last-Executed} Iteration {(LEI)}, identifies cyclic paths of execution better than {NET}, improving locality of execution while reducing the size of the code cache. Our second algorithm allows overlapping traces of similar execution frequency to be combined into a single large region. This second technique can be applied to both {NET} and {LEI}, and we find that it significantly improves metrics of locality and memory overhead for each.},
+	journal = {Proceedings of the 38th annual {IEEE/ACM} International Symposium on Microarchitecture},
+	author = {Hiniker, David and Hazelwood, Kim and Smith, Michael D},
+	year = {2005},
+	note = {{ACM} {ID:} 1100546},
+	keywords = {microprocessors and microcomputers, optimization, performance},
+	pages = {141&#8211;154}
+},
+
+ at book{muchnick_advanced_1997,
+	title = {Advanced Compiler Design and Implementation},
+	isbn = {9781558603202},
+	publisher = {Morgan Kaufmann},
+	author = {Muchnick, Steven S. and Muchnick},
+	month = sep,
+	year = {1997}
+},
+
+ at misc{pall_luajit_2009,
+	title = {{LuaJIT} 2.0 intellectual property disclosure and research opportunities},
+	note = {http://lua-users.org/lists/lua-l/2009-11/msg00089.html (accessed
+        June 2011)},
+	author = {Pall, Mike},
+	month = nov,
+	year = {2009}
+},
+
+ at inproceedings{chang_tracing_2009,
+	address = {Washington, {DC}},
+	title = {Tracing for Web 3.0: Trace Compilation for the Next Generation Web Applications},
+	isbn = {978-1-60558-375-4},
+	shorttitle = {Tracing for web 3.0},
+	url = {http://portal.acm.org/citation.cfm?id=1508293.1508304},
+	doi = {10.1145/1508293.1508304},
+	abstract = {Today's web applications are pushing the limits of modern web browsers. The emergence of the browser as the platform of choice for rich client-side applications has shifted the use of in-browser {JavaScript} from small scripting programs to large computationally intensive application logic. For many web applications, {JavaScript} performance has become one of the bottlenecks preventing the development of even more interactive client side applications. While traditional just-in-time compilation is successful for statically typed virtual machine based languages like Java, compiling {JavaScript} turns out to be a challenging task. Many {JavaScript} programs and scripts are short-lived, and users expect a responsive browser during page loading. This leaves little time for compilation of {JavaScript} to generate machine code.},
+	booktitle = {{VEE}},
+	publisher = {{ACM}},
+	author = {Chang, Mason and Smith, Edwin and Reitmaier, Rick and Bebenita, Michael and Gal, Andreas and Wimmer, Christian and Eich, Brendan and Franz, Michael},
+	year = {2009},
+	keywords = {dynamically typed languages, forth, tamarin, trace trees, tracing, type specialization},
+	pages = {71--80}
+},
+
+ at inproceedings{davide_ancona_rpython:_2007,
+	address = {Montreal, Quebec, Canada},
+	title = {{RPython:} a step towards reconciling dynamically and statically typed {OO} languages},
+	isbn = {978-1-59593-868-8},
+	shorttitle = {{RPython}},
+	url = {http://portal.acm.org/citation.cfm?id=1297091},
+	doi = {10.1145/1297081.1297091},
+	abstract = {Although the C-based interpreter of Python is reasonably fast, implementations on the {CLI} or the {JVM} platforms offers some advantages in terms of robustness and interoperability. Unfortunately, because the {CLI} and {JVM} are primarily designed to execute statically typed, object-oriented languages, most dynamic language implementations cannot use the native bytecodes for common operations like method calls and exception handling; as a result, they are not able to take full advantage of the power offered by the {CLI} and {JVM.}},
+	booktitle = {{DLS}},
+	publisher = {{ACM}},
+	author = {Davide Ancona and Massimo Ancona and Antonio Cuni and Nicholas D. Matsakis},
+	year = {2007},
+	keywords = {{JVM}, .net, Python}
+},
+
+ at article{futamura_partial_1999,
+	title = {Partial Evaluation of Computation Process - An Approach to a {Compiler-Compiler}},
+	volume = {12},
+	url = {http://citeseer.ist.psu.edu/futamura99partial.html},
+	number = {4},
+	journal = {{Higher-Order} and Symbolic Computation},
+	author = {Futamura, Yoshihiko},
+	year = {1999},
+	keywords = {Futamura},
+	pages = {381--391}
+},
+
+ at book{jones_partial_1993,
+	title = {Partial evaluation and automatic program generation},
+	isbn = {0-13-020249-5},
+	url = {http://portal.acm.org/citation.cfm?id=153676},
+	abstract = {This book is out of print. For copies, Please refer to the following online page},
+	publisher = {{Prentice-Hall}},
+	author = {Jones, Neil D. and Gomard, Carsten K. and Sestoft, Peter},
+	year = {1993}
+},
+
+ at inproceedings{armin_rigo_pypys_2006,
+	address = {Portland, Oregon, {USA}},
+	title = {{PyPy's} approach to virtual machine construction},
+	isbn = {{1-59593-491-X}},
+	url = {http://portal.acm.org/citation.cfm?id=1176753},
+	doi = {10.1145/1176617.1176753},
+	abstract = {The {PyPy} project seeks to prove both on a research and a practical level the feasibility of constructing a virtual machine {(VM)} for a dynamic language in a dynamic language - in this case, Python. The aim is to translate (i.e. compile) the {VM} to arbitrary target environments, ranging in level from {C/Posix} to {Smalltalk/Squeak} via Java and {CLI/.NET}, while still being of reasonable efficiency within these {environments.A} key tool to achieve this goal is the systematic reuse of the Python language as a system programming language at various levels of our architecture and translation process. For each level, we design a corresponding type system and apply a generic type inference engine - for example, the garbage collector is written in a style that manipulates simulated pointer and address objects, and when translated to C these operations become C-level pointer and address instructions.},
+	booktitle = {{DLS}},
+	publisher = {{ACM}},
+	author = {Armin Rigo and Samuele Pedroni},
+	year = {2006},
+	keywords = {metacircularity, Python, retargettable code generation, type inference, {VM}}
+},
+
+ at article{georges_statistically_2007,
+	title = {Statistically rigorous java performance evaluation},
+	volume = {42},
+	url = {http://portal.acm.org/citation.cfm?id=1297105.1297033},
+	doi = {10.1145/1297105.1297033},
+	abstract = {Java performance is far from being trivial to benchmark because it is affected by various factors such as the Java application, its input, the virtual machine, the garbage collector, the heap size, etc. In addition, non-determinism at run-time causes the execution time of a Java program to differ from run to run. There are a number of sources of non-determinism such as {Just-In-Time} {(JIT)} compilation and optimization in the virtual machine {(VM)} driven by timer-based method sampling, thread scheduling, garbage collection, and various.},
+	number = {10},
+	journal = {{SIGPLAN} Notices},
+	author = {Georges, Andy and Buytaert, Dries and Eeckhout, Lieven},
+	year = {2007},
+	keywords = {benchmarking, data analysis, methodology, statistics},
+	pages = {57--76}
+},
+
+ at inproceedings{bolz_tracing_2009,
+	address = {Genova, Italy},
+	title = {Tracing the meta-level: {PyPy's} tracing {JIT} compiler},
+	isbn = {978-1-60558-541-3},
+	shorttitle = {Tracing the meta-level},
+	url = {http://portal.acm.org/citation.cfm?id=1565827},
+	doi = {10.1145/1565824.1565827},
+	abstract = {We attempt to apply the technique of Tracing {JIT} Compilers in the context of the {PyPy} project, i.e., to programs that are interpreters for some dynamic languages, including Python. Tracing {JIT} compilers can greatly speed up programs that spend most of their time in loops in which they take similar code paths. However, applying an unmodified tracing {JIT} to a program that is itself a bytecode interpreter results in very limited or no speedup. In this paper we show how to guide tracing {JIT} compilers to greatly improve the speed of bytecode interpreters. One crucial point is to unroll the bytecode dispatch loop, based on two kinds of hints provided by the implementer of the bytecode interpreter. We evaluate our technique by applying it to two {PyPy} interpreters: one is a small example, and the other one is the full Python interpreter.},
+	booktitle = {{ICOOOLPS}},
+	publisher = {{ACM}},
+	author = {Bolz, Carl Friedrich and Cuni, Antonio and Fija&#322;kowski, Maciej and Rigo, Armin},
+	year = {2009},
+	pages = {18--25}
+},
+
+ at article{bala_dynamo:_2000,
+	title = {Dynamo: a transparent dynamic optimization system},
+	volume = {35},
+	shorttitle = {Dynamo},
+	url = {http://citeseer.ist.psu.edu/bala00dynamo.html},
+	number = {5},
+	journal = {{ACM} {SIGPLAN} Notices},
+	author = {Bala, Vasanth and Duesterwald, Evelyn and Banerjia, Sanjeev},
+	year = {2000},
+	keywords = {toread},
+	pages = {1--12}
+},
+
+ at techreport{andreas_gal_incremental_2006,
+	title = {Incremental Dynamic Code Generation with Trace Trees},
+	abstract = {The unit of compilation for traditional just-in-time compilers is the method. We have explored trace-based compilation, in which the unit of compilation is a loop, potentially spanning multiple methods and even library code. Using a new intermediate representation that is discovered and updated lazily on-demand while the program is being executed, our compiler generates code that is competitive with traditional dynamic compilers, but that uses only a fraction of the compile time and memory footprint.},
+	number = {{ICS-TR-06-16}},
+	institution = {Donald Bren School of Information and Computer Science, University of California, Irvine},
+	author = {Andreas Gal and Michael Franz},
+	month = nov,
+	year = {2006},
+	pages = {11}
+},
+
+ at inproceedings{gal_hotpathvm:_2006,
+	address = {Ottawa, Ontario, Canada},
+	title = {{HotpathVM:} an effective {JIT} compiler for resource-constrained devices},
+	isbn = {1-59593-332-6},
+	shorttitle = {{HotpathVM}},
+	url = {http://portal.acm.org/citation.cfm?doid=1134760.1134780},
+	doi = {10.1145/1134760.1134780},
+	abstract = {We present a just-in-time compiler for a Java {VM} that is small enough to fit on resource-constrained devices, yet is surprisingly effective. Our system dynamically identifies traces of frequently executed bytecode instructions (which may span several basic blocks across several methods) and compiles them via Static Single Assignment {(SSA)} construction. Our novel use of {SSA} form in this context allows to hoist instructions across trace side-exits without necessitating expensive compensation code in off-trace paths. The overall memory consumption (code and data) of our system is only 150 {kBytes}, yet benchmarks show a speedup that in some cases rivals heavy-weight just-in-time compilers.},
+	booktitle = {{VEE}},
+	publisher = {{ACM}},
+	author = {Gal, Andreas and Probst, Christian W. and Franz, Michael},
+	year = {2006},
+	keywords = {dynamic compilation, embedded, software trace scheduling, {SSA}, {VM}}
+},
+
+ at inproceedings{mario_wolczko_towards_1999,
+	title = {Towards a Universal Implementation Substrate for {Object-Oriented} Languages},
+	abstract = {Self is a minimalist object-oriented language with a sophisticated implementation that utilizes adaptive optimization. We have built implementations of Smalltalk and Java by translation to Self. These implementations were much easier to construct in Self than by conventional means, and perform surprisingly well (competitively with conventional, commercial implementations). This leads us to believe that a Self-like system may form the basis of a universal substrate for implementation of object-oriented languages.},
+	booktitle = {{OOPSLA} workshop on Simplicity, Performance, and Portability in Virtual Machine Design},
+	author = {Mario Wolczko and Ole Agesen and David Ungar},
+	year = {1999},
+	keywords = {fixme}
+},
+
+ at inproceedings{hoelzle_optimizing_1994,
+	address = {Orlando, Florida, United States},
+	title = {Optimizing dynamically-dispatched calls with run-time type feedback},
+	isbn = {{0-89791-662-X}},
+	url = {http://portal.acm.org/citation.cfm?id=178243.178478},
+	doi = {10.1145/178243.178478},
+	abstract = {Note: {OCR} errors may be found in this Reference List extracted from the full text article. {ACM} has opted to expose the complete List rather than only correct and linked references.},
+	booktitle = {{PLDI}},
+	publisher = {{ACM}},
+	author = {H&#246;lzle, Urs and Ungar, David},
+	year = {1994},
+	keywords = {{JIT}, polymorphic inline cache, self, type-feedback},
+	pages = {326--336}
+},
+
+ at inproceedings{yermolovich_optimization_2009,
+	address = {Orlando, Florida, {USA}},
+	title = {Optimization of dynamic languages using hierarchical layering of virtual machines},
+	isbn = {978-1-60558-769-1},
+	url = {http://portal.acm.org/citation.cfm?id=1640134.1640147},
+	doi = {10.1145/1640134.1640147},
+	abstract = {Creating an interpreter is a simple and fast way to implement a dynamic programming language. With this ease also come major drawbacks. Interpreters are significantly slower than compiled machine code because they have a high dispatch overhead and cannot perform optimizations. To overcome these limitations, interpreters are commonly combined with just-in-time compilers to improve the overall performance. However, this means that a just-in-time compiler has to be implemented for each language.
+
+We explore the approach of taking an interpreter of a dynamic 
+language and running it on top of an optimizing trace-based virtual machine, i.e., we run a guest {VM} on top of a host {VM.} The host {VM} uses trace recording to observe the guest {VM} executing the application program. Each recorded trace represents a sequence
+of guest {VM} bytecodes corresponding to a given execution path
+through the application program. The host {VM} optimizes and compiles these traces to machine code, thus eliminating the need for a custom just-in-time compiler for the guest {VM.} The guest {VM} only needs to provide basic  information about its interpreter loop to the
+host {VM.}},
+	booktitle = {{DLS}},
+	publisher = {{ACM}},
+	author = {Yermolovich, Alexander and Wimmer, Christian and Franz, Michael},
+	year = {2009},
+	keywords = {actionscript, dynamic languages, hierarchical virtual machines, trace compilation},
+	pages = {79--88}
+},
+
+ at inproceedings{chambers_efficient_1989,
+	title = {An efficient implementation of {SELF} a dynamically-typed object-oriented language based on prototypes},
+	volume = {24},
+	url = {http://portal.acm.org/citation.cfm?id=74884},
+	doi = {10.1145/74878.74884},
+	abstract = {We have developed and implemented techniques that double the performance of dynamically-typed object-oriented languages. Our {SELF} implementation runs twice as fast as the fastest Smalltalk implementation, despite {SELF's} lack of classes and explicit variables. To compensate for the absence of classes, our system uses implementation-level maps to transparently group objects cloned from the same prototype, providing data type information and eliminating the apparent space overhead for prototype-based systems. To compensate for dynamic typing, user-defined control structures, and the lack of explicit variables, our system dynamically compiles multiple versions of a source method, each customized according to its receiver's map. Within each version the type of the receiver is fixed, and thus the compiler can statically bind and inline all messages sent to self. Message splitting and type prediction extract and preserve even more static type information, allowing the compiler to inline many other messages. Inlining dramatically improves performance and eliminates the need to hard-wire low-level methods such as +,==, and {ifTrue:.} Despite inlining and other optimizations, our system still supports interactive programming environments. The system traverses internal dependency lists to invalidate all compiled methods affected by a programming change. The debugger reconstructs inlined stack frames from compiler-generated debugging information, making inlining invisible to the {SELF} programmer.},
+	booktitle = {{OOPSLA}},
+	author = {Chambers, C. and Ungar, D. and E. Lee},
+	year = {1989},
+	keywords = {self, specialization}
+},
+
+ at inproceedings{hoelzle_optimizing_1991,
+	title = {Optimizing {Dynamically-Typed} {Object-Oriented} Languages With Polymorphic Inline Caches},
+	isbn = {3-540-54262-0},
+	url = {http://portal.acm.org/citation.cfm?id=679193&dl=ACM&coll=portal},
+	booktitle = {{ECOOP}},
+	publisher = {{Springer-Verlag}},
+	author = {H&#246;lzle, Urs and Chambers, Craig and Ungar, David},
+	year = {1991}
+},
+
+ at inproceedings{rigo_representation-based_2004,
+	address = {Verona, Italy},
+	title = {Representation-based just-in-time specialization and the Psyco prototype for Python},
+	isbn = {1-58113-835-0},
+	url = {http://portal.acm.org/citation.cfm?id=1014010},
+	doi = {10.1145/1014007.1014010},
+	abstract = {A powerful application of specialization is to remove interpretative overhead: a language can be implemented with an interpreter, whose performance is then improved by specializing it for a given program source. This approach is only moderately successful with very high level languages, where the operation of each single step can be highly dependent on run-time data and context. In the present paper, the Psyco prototype for the Python language is presented. It introduces two novel techniques. The first is just-in-time specialization, or specialization by need, which introduces the "unlifting" ability for a value to be promoted from run-time to compile-time during specialization -- the inverse of the lift operator of partial evaluation. Its presence gives an unusual and powerful perspective on the specialization process. The second technique is representations, a theory of data-oriented specialization generalizing the traditional specialization domains (i.e. the compile-time/run-time dichotomy).},
+	booktitle = {{PEPM}},
+	publisher = {{ACM}},
+	author = {Rigo, Armin},
+	year = {2004},
+	keywords = {{JIT}, Python}
+},
+
+ at inproceedings{sullivan_dynamic_2003,
+	address = {San Diego, California},
+	title = {Dynamic native optimization of interpreters},
+	isbn = {1-58113-655-2},
+	url = {http://portal.acm.org/citation.cfm?id=858570.858576},
+	doi = {10.1145/858570.858576},
+	abstract = {For domain specific languages, "scripting languages", dynamic languages, and for virtual machine-based languages, the most straightforward implementation strategy is to write an interpreter. A simple interpreter consists of a loop that fetches the next bytecode, dispatches to the routine handling that bytecode, then loops. There are many ways to improve upon this simple mechanism, but as long as the execution of the program is driven by a representation of the program other than as a stream of native instructions, there will be some "interpretive {overhead".There} is a long history of approaches to removing interpretive overhead from programming language implementations. In practice, what often happens is that, once an interpreted language becomes popular, pressure builds to improve performance until eventually a project is undertaken to implement a native Just In Time {(JIT)} compiler for the language. Implementing a {JIT} is usually a large effort, affects a significant part of the existing language implementation, and adds a significant amount of code and complexity to the overall code {base.In} this paper, we present an innovative approach that dynamically removes much of the interpreted overhead from language implementations, with minimal instrumentation of the original interpreter. While it does not give the performance improvements of hand-crafted native compilers, our system provides an appealing point on the language implementation spectrum.},
+	booktitle = {Workshop on Interpreters, virtual machines and emulators},
+	publisher = {{ACM}},
+	author = {Sullivan, Gregory T. and Bruening, Derek L. and Baron, Iris and Garnett, Timothy and Amarasinghe, Saman},
+	year = {2003}
+}
diff --git a/talk/iwtc11/paper.tex b/talk/iwtc11/paper.tex
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/paper.tex
@@ -0,0 +1,1014 @@
+%-----------------------------------------------------------------------------
+%
+%               Template for sigplanconf LaTeX Class
+%
+% Name:         sigplanconf-template.tex
+%
+% Purpose:      A template for sigplanconf.cls, which is a LaTeX 2e class
+%               file for SIGPLAN conference proceedings.
+%
+% Author:       Paul C. Anagnostopoulos
+%               Windfall Software
+%               978 371-2316
+%               paul at windfall.com
+%
+% Created:      15 February 2005
+%
+%-----------------------------------------------------------------------------
+
+
+\documentclass[preprint]{sigplanconf}
+
+% The following \documentclass options may be useful:
+%
+% 10pt          To set in 10-point type instead of 9-point.
+% 11pt          To set in 11-point type instead of 9-point.
+% authoryear    To obtain author/year citation style instead of numeric.
+
+\usepackage{ifthen}
+\usepackage{fancyvrb}
+\usepackage{color}
+\usepackage{ulem}
+\usepackage{xspace}
+\usepackage{epsfig}
+\usepackage{amssymb}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage[utf8]{inputenc}
+\usepackage{setspace}
+\usepackage{relsize}
+
+\usepackage{listings}
+
+\usepackage[T1]{fontenc}
+\usepackage{setspace}
+\usepackage{listings}
+\usepackage{beramono}
+
+
+\definecolor{gray}{rgb}{0.3,0.3,0.3}
+
+\lstset{
+  basicstyle=\setstretch{1.05}\ttfamily\footnotesize,
+  language=Python,
+  keywordstyle=\bfseries,
+  stringstyle=\color{blue},
+  commentstyle=\color{gray}\textit,
+  fancyvrb=true,
+  showstringspaces=false,
+  %keywords={def,while,if,elif,return,class,get,set,new,guard_class}
+  numberstyle = \tiny,
+  numbersep = -20pt,
+}
+
+
+\newboolean{showcomments}
+\setboolean{showcomments}{true}
+\ifthenelse{\boolean{showcomments}}
+  {\newcommand{\nb}[2]{
+    \fbox{\bfseries\sffamily\scriptsize#1}
+    {\sf\small$\blacktriangleright$\textit{#2}$\blacktriangleleft$}
+   }
+   \newcommand{\version}{\emph{\scriptsize$-$Id: main.tex 19055 2008-06-05 11:20:31Z cfbolz $-$}}
+  }
+  {\newcommand{\nb}[2]{}
+   \newcommand{\version}{}
+  }
+
+\newcommand\cfbolz[1]{\nb{CFB}{#1}}
+\newcommand\arigo[1]{\nb{AR}{#1}}
+\newcommand\fijal[1]{\nb{FIJAL}{#1}}
+\newcommand\david[1]{\nb{DAVID}{#1}}
+\newcommand\anto[1]{\nb{ANTO}{#1}}
+\newcommand\reva[1]{\nb{Reviewer 1}{#1}}
+\newcommand\revb[1]{\nb{Reviewer 2}{#1}}
+\newcommand\revc[1]{\nb{Reviewer 3}{#1}}
+\newcommand{\commentout}[1]{}
+\newcommand{\ignore}[1]{} % {{\tt \small ignore(#1)}}
+
+\newcommand\ie{i.e.,\xspace}
+\newcommand\eg{e.g.,\xspace}
+\newcommand{\etal}{\emph{et al.}\xspace}
+
+\normalem
+
+\let\oldcite=\cite
+
+\renewcommand\cite[1]{\ifthenelse{\equal{#1}{XXX}}{[citation~needed]}{\oldcite{#1}}}
+
+
+\begin{document}
+
+\conferenceinfo{IWTC '11}{XXX} 
+\copyrightyear{2011} 
+\copyrightdata{[to be supplied]} 
+
+\titlebanner{draft}        % These are ignored unless
+%\preprintfooter{short description of paper}   % 'preprint' option specified.
+
+\title{Loop-Aware Optimizations in PyPy's Tracing JIT}
+%\subtitle{Subtitle Text, if any}
+
+\authorinfo{H\aa kan Ard&#246;}
+           {Centre for Mathematical Sciences, Lund University}
+           {hakan at debian.org}
+\authorinfo{Carl Friedrich Bolz}
+           {Heinrich-Heine-Universit&#228;t D&#252;sseldorf}
+           {cfbolz at gmx.de}
+\authorinfo{Maciej Fija&#322;kowski}
+           {Unaffiliated}
+           {fijall at gmail.com}
+
+\maketitle
+
+\begin{abstract}
+By introducing loop peeling into the optimization step of a tracing
+jit the effect of optimizations already in place will be increased
+greatly. Not only will they become able to move loop invariant code
+out of loop. They will also become able to reuse results from the
+previous iteration. Also, the implementation of excising optimizations
+can be left almost intact as they will not have to interact much with
+the loop peeling.
+
+Several benchmarks, with few guard failures, executed on the
+PyPy Python JIT show over 2
+times increase in speed when loop peeling was introduced. This makes
+some of them almost match optimized C performance and become over 900
+times faster than CPython.
+\end{abstract}
+
+\category{D.3.4}{Programming Languages}{Processors}[code generation,
+incremental compilers, interpreters, run-time environments]
+
+\terms
+Languages, Performance, Experimentation
+
+\keywords{Tracing JIT, Optimization, Loop-Invariant Code Motion}
+
+\section{Introduction}
+
+One of the advantages that tracing JIT compilers have above traditional
+method-based
+JITs is that their optimizers are much easier to write. Because a tracing JIT
+produces only linear pieces of code without control flow joins, many
+optimization passes on traces can have a very simple structure. They often
+consist of one forward pass replacing operations by simpler ones or even
+discarding them as they walk along it. This makes
+optimization of traces very similar to symbolic execution. Also, many
+difficult problems in traditional optimizers become tractable if the optimizer
+does not need to deal with control flow merges.
+
+One disadvantage of this simplicity is that such simple forward-passing
+optimizers ignore the only bit of control flow they have available, which is
+the fact that most traces actually represent loops. Making use of this
+information is necessary to perform optimizations that take the whole loop into
+account, such as loop-invariant code
+motion or optimizations that improve across several iterations of the loop.
+Having to deal with this property of traces complicates the optimization passes,
+as a more global view of a trace needs to be considered when optimizing.
+
+In this paper we want to address this problem by proposing a simple scheme that
+makes it possible to turn optimizations using one forward pass into
+optimizations that can do loop invariant code motion and similar loop-aware
+improvements. Using this scheme one does not need to change the underlying
+optimization much to get these advantages.
+
+The resulting optimizations one gets using this scheme are in no way novel, most
+of them are well-known loop optimizations. However, the way to implement them is
+a lot simpler than directly implementing loop-aware optimizations.
+
+% loop peeling does a lot more than loop-invariant code motion
+% take this loop as an example:
+% [i1, i2]
+% i3 = i1 + 1
+% i4 = i2 + 1
+% escape(i4)
+% jump(i2, i3)
+% none of the operations is loop-invariant, but loop peeling will still remove the second addition
+
+\section{Background: PyPy}
+\label{sec:PyPy}
+
+The work described in this paper was done in the context of the PyPy
+project\footnote{\texttt{http://pypy.org}}. PyPy is a framework for implementing
+dynamic languages efficiently \cite{armin_rigo_pypys_2006}. When implementing a
+language with PyPy, one writes an interpreter for the language in RPython
+\cite{davide_ancona_rpython:_2007}. RPython (``Restricted Python``) is a subset
+of Python chosen in such a way that it can be efficiently translated to a
+C-based VM by performing type inference.
+
+Many low-level aspects of the final VM are not contained within the interpreter
+implementation but are inserted during translation to C. Examples for this are a
+garbage collector and also a tracing JIT compiler \cite{bolz_tracing_2009}.
+
+PyPy's tracing JIT compiler traces on the level of RPython programs. Thus it
+actually traces the execution of an interpreter written in RPython, not of the
+program itself. This makes the details of the object model of the implemented
+language transparent and optimizable by the tracing JIT. In the context of this
+paper, this aspect of PyPy's tracing JIT can be ignored. Instead, it is
+sufficient to view PyPy's tracing JIT as a JIT for RPython.
+
+
+% section PyPy (end)
+
+\section{Motivation}
+\label{sec:Motivation}
+
+To motivate the approach we propose here, let's look at a trivial (unrealistic)
+trace which corresponds to an infinite loop:
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($i_{0}$):
+$i_1$ = $i_0$ + 1
+print($i_1$)
+jump($L_0$, $i_0$)
+\end{lstlisting}
+
+The first line is a label $L_0$ with argument $i_0$. Every label has a list of
+arguments. The \lstinline{print} operation just prints its argument (it is not
+an operation that PyPy's tracing JIT really supports, we just use it for this
+example). The \lstinline{jump} operation jumps back to the beginning of the
+trace, listing the new values of the arguments of the trace. In this case, the
+new value of $i_0$ is $i_0$, making it a loop-invariant.
+
+Because $i_0$ is loop-invariant, the addition could be moved out of the loop.
+However, we want to get this effect using our existing optimization passes
+without changing them too much. To achieve this, we peel one iteration off the
+loop before running the optimizations. This peeling gives the following trace:
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($i_{0}$):
+$i_1$ = $i_0$ + 1
+print($i_1$)
+jump($L_1$, $i_0$)
+
+$L_1$($i_{0}$):
+$i_2$ = $i_0$ + 1
+print($i_2$)
+jump($L_1$, $i_0$)
+\end{lstlisting}
+
+The iteration of the loop that was peeled off (lines 1-4) is called the
+\emph{preamble}, the loop afterwards the \emph{peeled loop}.
+
+Now the optimizer optimizes both of these two iterations of the loop together,
+disregarding the \lstinline{jump} and the label in lines 4-6. Doing this, common
+subexpression elimination will discover that the two additions are the same, and
+replace $i_2$ with $i_1$. This leads to the following trace:
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($i_{0}$):
+$i_1$ = $i_0$ + 1
+print($i_1$)
+jump($L_1$, $i_0$)
+
+$L_1$($i_{0}$):
+print($i_1$)
+jump($L_1$, $i_0$)
+\end{lstlisting}
+
+This trace is malformed, because $i_1$ is used after the label $L_1$ without
+being passed there, so we need to add $i_1$ as an argument to the label and pass
+it along the \lstinline{jump}s:
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($i_{0}$):
+$i_1$ = $i_0$ + 1
+print($i_1$)
+jump($L_1$, $i_0$, $i_1$)
+
+$L_1$($i_{0}$, $i_1$):
+print($i_1$)
+jump($L_1$, $i_0$, $i_1$)
+\end{lstlisting}
+
+The final result is that the loop-invariant code was moved out of the loop into
+the peeled-off iteration. Thus the addition is only executed in the first
+iteration, while the result is reused in all further iterations.
+
+This scheme is quite powerful and generalizes to other optimizations than just
+common subexpression elimination. It allows simple linear optimization passes to
+perform loop-aware optimizations, such as loop-invariant code motion without
+changing them at all. All that is needed is to peel off one iteration, then
+apply simple one-pass optimizations and make sure that the necessary extra
+arguments are inserted into the label of the loop itself and the jumps
+afterwards. Giving the optimizations two iterations together
+gives the optimization enough context to remove operations from the peeled loop,
+because it detects that the operation was performed in the preamble already.
+
+
+% section Motivation (end)
+
+\section{Running Example}
+\label{sub:example}
+
+For the purpose of this paper, we are going to use a tiny interpreter for a dynamic language with
+ a very simple object
+model, that just supports an integer and a float type (this example has been taken from a previous paper \cite{bolz_allocation_2011}). The objects support only
+one operation, \lstinline{add}, which adds two objects (promoting ints to floats in a
+mixed addition). The implementation of \lstinline{add} uses classical Smalltalk-like
+double-dispatching.
+%These classes could be part of the implementation of a very
+%simple interpreter written in RPython.
+The classes can be seen in
+Figure~\ref{fig:objmodel} (written in RPython).
+
+\begin{figure}
+\begin{lstlisting}[mathescape,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+class Base(object):
+   pass
+
+class BoxedInteger(Base):
+   def __init__(self, intval):
+      self.intval = intval
+
+   def add(self, other):
+      return other.add__int(self.intval)
+
+   def add__int(self, intother):
+      return BoxedInteger(intother + self.intval)
+
+   def add__float(self, floatother):
+      floatvalue = floatother + float(self.intval)
+      return BoxedFloat(floatvalue)
+
+
+class BoxedFloat(Base):
+   def __init__(self, floatval):
+      self.floatval = floatval
+
+   def add(self, other):
+      return other.add__float(self.floatval)
+
+   def add__int(self, intother):
+      floatvalue = float(intother) + self.floatval
+      return BoxedFloat(floatvalue)
+
+   def add__float(self, floatother):
+      return BoxedFloat(floatother + self.floatval)
+
+
+def f(y):
+   step = BoxedInteger(-1)
+   while True:
+      y = y.add(step)
+\end{lstlisting}
+\caption{An ``Interpreter'' for a Tiny Dynamic Language Written in RPython}
+\label{fig:objmodel}
+\end{figure}
+
+Using these classes to implement arithmetic shows the basic problem of many
+dynamic language implementations. All the numbers are instances of either
+\lstinline{BoxedInteger} or \lstinline{BoxedFloat}, therefore they consume space on the
+heap. Performing many arithmetic operations produces lots of garbage quickly,
+putting pressure on the garbage collector. Using double dispatching to
+implement the numeric tower needs two method calls per arithmetic operation,
+which is costly due to the method dispatch.
+
+Let us now consider a simple ``interpreter'' function \lstinline{f} that uses the
+object model (see the bottom of Figure~\ref{fig:objmodel}).
+Simply running this function is slow, because there are lots of virtual method
+calls inside the loop, two for each
+call to \lstinline{add}. These method calls need to check the type of the involved
+objects every iteration. In addition, a lot of objects are created
+when executing that loop, many of these objects are short-lived.
+The actual computation that is performed by \lstinline{f} is simply a sequence of
+float or integer additions (note that \lstinline{f} does not actually terminate,
+but it is still instructive to look at the produced traces).
+
+
+\begin{figure}
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($p_{0}$, $p_{1}$):
+# inside f: y = y.add(step)
+guard_class($p_{1}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{2}$ = get($p_{1}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{3}$ = get($p_{0}$, intval)
+        $i_{4}$ = $i_{2} + i_{3}$
+        $p_{5}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{5}$, intval, $i_{4}$)
+jump($L_0$, $p_{0}$, $p_{5}$)
+\end{lstlisting}
+\caption{An Unoptimized Trace of the Example Interpreter}
+\label{fig:unopt-trace}
+\end{figure}
+
+If the function is executed using the tracing JIT, with \lstinline{y} being a
+\lstinline{BoxedInteger}, the produced trace looks like the one of
+Figure~\ref{fig:unopt-trace} (lines starting with a hash ``\#'' are comments).
+The trace corresponds to one iteration of the while-loop in \lstinline{f}.
+
+The operations in the trace are indented
+corresponding to the stack level of the function that contains the traced
+operation. The trace is in single-assignment form, meaning that each variable is
+assigned a value exactly once. The arguments $p_0$ and $p_1$ of the loop correspond
+to the live variables \lstinline{y} and \lstinline{step} in the while-loop of
+the original function.
+
+The label of the loop is $L_0$ and is used by the jump instruction to
+identify it's jump target.
+
+The operations in the trace correspond to the operations in the RPython program
+in Figure~\ref{fig:objmodel}:
+
+\begin{itemize}
+    \item \lstinline{new} creates a new object.
+    \item \lstinline{get} reads an attribute of an object.
+    \item \lstinline{set} writes to an attribute of an object.
+    \item \lstinline{guard_class} is a precise type check. It typically precedes
+    an (inlined) method call and is followed by the trace of the called method.
+\end{itemize}
+
+Method calls in the trace are preceded by a \lstinline{guard_class}
+operation, to check that the class of the receiver is the same as the one that
+was observed during tracing.\footnote{\lstinline{guard_class}
+performs a precise
+class check, not checking for subclasses.} These guards make the trace specific
+to the situation where \lstinline{y} is really a \lstinline{BoxedInteger}. When
+the trace is turned into machine code and afterwards executed with
+\lstinline{BoxedFloat}, the
+first \lstinline{guard_class} instruction will fail and execution will continue
+using the interpreter.
+
+\section{Making Trace Optimizations Loop Aware}
+
+XXX make clear that the preamble is not necessarily the \emph{first} iteration
+of a loop
+
+Before the trace is passed to a backend compiling it into machine code
+it needs to be optimized to achieve better performance.
+The focus of this paper
+is loop invariant code motion. The goal of that is to move as many
+operations as possible out of the loop making them executed at most once
+and not every iteration. This we propose to achieve by loop peeling. It
+leaves the loop body intact, but prefixes it with one iteration of the
+loop. This operation by itself will not achieve anything. But if it is
+combined with other optimizations it can increase the effectiveness of
+those optimizations. For many optimization of interest some care has
+to be taken when they are combined with loop peeling. This is
+described below by first explaining the loop peeling optimization
+followed by a set of other optimizations and how they interact with
+loop peeling.
+
+\subsection{Loop Peeling}
+
+\begin{figure}
+\begin{center}
+\includegraphics[scale=1]{figures/overview}
+\end{center}
+\caption{Overview of Loop Peeling}
+\label{fig:overview}
+\end{figure}
+
+XXX find reference of prior work on this
+
+Loop peeling is achieved by appending an copy of the traced iteration at
+the end of itself. See Figure~\ref{fig:overview} for an illustration.
+The first part (called \emph{preamble}) finishes with the jump the the second part
+(called the \emph{peeled loop}). The second part end with the jump to itself. This way
+the preamble will be executed only once while the peeled loop will
+be used for every further iteration. New variable names have to be
+introduced in the entire copied trace in order to maintian the SSA-property.
+Note that the peeled loop is not necessary the \emph{first} iteration of the
+loop execution, it is general enough to correspond to any iteration of the loop.
+However, the peeled loop can then be optimized using the assumption that a
+previous iteration has happened.
+
+When applying optimizations to this two-iteration trace
+some care has to taken as to how the arguments of the two
+\lstinline{jump} operations and the input arguments of the peeled loop are
+treated. It has to be ensured that the peeled loop stays a proper
+trace in the sense that the operations within it only operates on
+variables that are either among its input arguments 
+or produced within the peeled loop. To ensure this we need
+to introduce a bit of formalism.
+
+The original trace (prior to peeling) consists of three parts.
+A vector of input
+variables, $I=\left(I_1, I_2, \cdots, I_{|I|}\right)$, a list of non-
+jump operations and a single
+jump operation. The jump operation contains a vector of jump variables,
+$J=\left(J_1, J_2, \cdots, J_{|J|}\right)$, that are passed as the input variables of the target loop. After
+loop peeling there will be a second copy of this trace with input
+variables equal to the jump arguments of the preamble, $J$, and jump
+arguments $K$. Looking  at the peeled version of our example in Figure~\ref{fig:peeled-trace} we have
+\begin{equation}
+  %\left\{
+    \begin{array}{lcl}
+      I &=& \left( p_0, p_1 \right) \\
+      J &=& \left( p_0, p_5 \right) \\
+      K &=& \left( p_0, p_9 \right) \\
+    \end{array}
+  %\right.
+  .
+\end{equation}
+To construct the second copy of the trace (the peeled loop) from the
+first (the preeamble) we need a
+function $m$, mapping the variables of the preamble onto the
+variables of the peeled loop. This function is constructed during the
+copying. It is initialized by mapping the input arguments, $I$, to
+the jump arguments $J$,
+\begin{equation}
+  m\left(I_i\right) = J_i \ \text{for}\ i = 1, 2, \cdots |I| .
+\end{equation}
+In the example that means:
+
+\begin{equation}
+  %\left\{
+    \begin{array}{lcl}
+      m\left(p_0\right) &=& p_0 \\
+      m\left(p_1\right) &=& p_5
+    \end{array}
+  %\right.
+  .
+\end{equation}
+
+
+
+Each operation in the trace is copied in order.
+To copy an operation $v=\text{op}\left(A_1, A_2, \cdots, A_{|A|}\right)$
+a new variable, $\hat v$ is introduced. The copied operation will
+return $\hat v$ using
+\begin{equation}
+  \hat v = \text{op}\left(m\left(A_1\right), m\left(A_2\right), 
+    \cdots, m\left(A_{|A|}\right)\right) . 
+\end{equation}
+Before the
+next operation is copied, $m$ is extend by assigning $m\left(v\right) = \hat
+v$. For the example above, after all the operations have been copied we have
+\begin{equation}
+  %\left\{
+    \begin{array}{lcl}
+      m\left(p_0\right) &=& p_0 \\
+      m\left(p_1\right) &=& p_5 \\
+      m\left(i_2\right) &=& i_6 \\
+      m\left(i_3\right) &=& i_7 \\
+      m\left(i_4\right) &=& i_8 \\
+      m\left(p_5\right) &=& p_9 \\
+    \end{array}
+  %\right.
+  .
+\end{equation}
+
+The trace from Figure~\ref{fig:unopt-trace} would after this operation become
+the trace in Figure~\ref{fig:peeled-trace}. Line 1-13 shows the
+preamble while line 15-27 shows the peeled loop.
+
+\begin{figure}
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($p_{0}$, $p_{1}$):
+# inside f: y = y.add(step)
+guard_class($p_{1}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{2}$ = get($p_{1}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{3}$ = get($p_{0}$, intval)
+        $i_{4}$ = $i_{2}+i_{3}$
+        $p_{5}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{5}$, intval, $i_{4}$)
+jump($L_1$, $p_{0}$, $p_{5}$)
+
+$L_1$($p_{0}$, $p_{5}$):
+# inside f: y = y.add(step)
+guard_class($p_{5}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{6}$ = get($p_{5}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{7}$ = get($p_{0}$, intval)
+        $i_{8}$ = $i_{6}+i_{7}$
+        $p_{9}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{9}$, intval, $i_{8}$)
+jump($L_1$, $p_{0}$, $p_{9}$)
+\end{lstlisting}
+\caption{A peeled trace of the Example Interpreter}
+\label{fig:peeled-trace}
+\end{figure}
+
+\section{Interaction of Optimizations with Loop Peeling}
+
+\subsection{Redundant Guard Removal}
+
+No special concerns needs to be taken when implementing redundant
+guard removal together with loop peeling. The guards from
+the preamble might make the guards of the peeled loop
+redundant and thus removed. Therefore one effect of combining redundant
+guard removal with loop peeling is that loop-invariant guards are moved out of the
+loop. The peeled loop of the example reduces to
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_1$($p_{0}$, $p_{5}$):
+# inside f: y = y.add(step)
+    # inside BoxedInteger.add
+    $i_{6}$ = get($p_{5}$, intval)
+        # inside BoxedInteger.add__int
+        $i_{7}$ = get($p_{0}$, intval)
+        $i_{8}$ = $i_{6}+i_{7}$
+        $p_{9}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{9}$, intval, $i_{8}$)
+jump($L_1$, $p_{0}$, $p_{9}$)
+\end{lstlisting}
+
+The guard on $p_5$ on line 17 of Figure~\ref{fig:peeled-trace} can be
+removed since $p_5$ is allocated on line 10 with a known class. The
+guard on $p_0$ on line 20 can be removed since it is identical to the
+guard on line 6.
+
+Note that the guard on $p_5$ is removed even though $p_5$ is not loop
+invariant, which shows that loop invariant code motion is not the only
+effect of loop peeling. Loop peeling can also remove guards that are implied by
+the guards of the previous iteration.
+
+
+
+\subsection{Common Subexpression Elimination and Heap Optimizations}
+
+If a pure operation appears more than once in the trace with the same input
+arguments, it only needs be executed the first time and then the result
+can be reused for all other appearances. PyPy's optimizers can also remove
+repeated heap reads if the intermediate operations cannot have changed their
+value\footnote{We perform a simple type-based alias analysis to know which
+writes can affect which reads. In addition writes on newly allocated objects
+can never change the value of old existing ones.}.
+
+When that is combined with loop peeling, the single execution of the operation
+is placed in the preamble. That is, loop invariant pure operations and heap
+reads are moved out of the loop. 
+
+Consider the \lstinline{get} operation on line 22 of
+Figure~\ref{fig:peeled-trace}. The result of this operation can be
+deduced to be $i_3$ from the \lstinline{get} operation on line
+8. The optimization will thus remove line 22 from the trace and
+replace $i_7$ with $i_3$. Afterwards the trace is no longer in the correct
+form, because the argument $i_3$ is not passed along the loop arguments. It
+thus needs to be added there.
+
+The trace from Figure~\ref{fig:peeled-trace} will therefore be optimized to:
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($p_{0}$, $p_{1}$):
+# inside f: y = y.add(step)
+guard_class($p_{1}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{2}$ = get($p_{1}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{3}$ = get($p_{0}$, intval)
+        $i_{4}$ = $i_{2}+i_{3}$
+        $p_{5}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{5}$, intval, $i_{4}$)
+jump($L_1$, $p_{0}$, $p_{5}$, $i_3$)
+
+$L_1$($p_{0}$, $p_{5}$, $i_3$):
+# inside f: y = y.add(step)
+guard_class($p_{5}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{6}$ = get($p_{5}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{8}$ = $i_{4}+i_{3}$
+        $p_{9}$ = new(BoxedInteger)
+            # inside BoxedInteger.__init__
+            set($p_{9}$, intval, $i_{8}$)
+jump($L_1$, $p_{0}$, $p_{9}$, $i_3$)
+\end{lstlisting}
+
+In general, after loop peeling and redundant operation removal the peeled loop
+will no longer be in SSA form as it operates on variables that are the result
+of pure operations in the preamble. The solution is to extend the input
+arguments, $J$, with those variables. This will also extend the
+jump arguments of the preamble, which is also $J$. 
+Implicitly that also extends the jump arguments of the peeled loop, $K$,
+since they are the image of $J$ under $m$. For the example $I$ has to
+be replaced by $\hat I$ which is formed by appending $i_3$ to $I$.
+At the same time $K$ has to be replaced by
+$\hat K$ which is formed by appending $m\left(i_3\right)=i_7$ to $K$.
+The variable $i_7$ will then be replaced by $i_3$ by the heap caching
+optimization as it has removed the variable $i_7$.
+
+In general what is needed is to keep track of
+which variables from the preamble it reuses in the peeled loop.
+It has to construct a vector, $H$,  of such variables which
+can be used to update the input and jump arguments using
+\begin{equation}
+  \hat J = \left(J_1, J_2, \cdots, J_{|J|}, H_1, H_2, \cdots, H_{|H}\right)
+  \label{eq:heap-inputargs}
+\end{equation}
+and
+\begin{equation}
+  \hat K = \left(K_1, K_2, \cdots, K_{|J|}, m(H_1), m(H_2), \cdots, m(H_{|H})\right)
+  .
+  \label{eq:heap-jumpargs}
+\end{equation}
+In the optimized trace $I$ is replaced by $\hat I$ and $K$ by $\hat
+K$.
+
+\subsection{Allocation Removals}
+PyPy's allocation removal optimization \cite{bolz_allocation_2011} makes it
+possible to identify objects that are allocated within the loop but never
+escape it. Those objects have to be allocated in the loop, but no outside
+object ever gets a reference short lived objects with no references outside the
+loop. This
+is performed by processing the operations in order and
+optimistically removing every \lstinline{new} operation. Later on if
+it is discovered that a reference to the object escapes the loop, the
+\lstinline{new} operation is inserted at this point. All operations
+(\lstinline{get}, \lstinline{set} and \lstinline{guard}) on the removed objects
+are also removed and the optimizer needs to keep track of the value of all used
+attributes of the object.
+
+Consider again the original unoptimized trace of
+Figure~\ref{fig:peeled-trace}. Line 10 contains the first
+allocation. It is removed and $p_5$ is marked as allocation-removed. This means
+that it refers to an object that has not yet been
+(and might never be) allocated. Line 12 sets the \lstinline{intval}
+attribute of $p_5$. This operation is also removed and the optimizer
+registers that the attribute \lstinline{intval} of $p_5$ is $i_4$.
+
+When the optimizer reaches line 13 it needs to construct the
+arguments of the \lstinline{jump} operation, which contains the
+reference to the allocation-removed object in $p_5$. This can be achieved by
+exploding $p_5$ into the fields of the allocation-removed object.
+In this case there is only one such field and its value is
+$i_4$, which means that $p_5$ is replaced with $i_4$ in the jump
+arguments. 
+
+In the general case, each allocation-removed object in the jump arguments is exploded into a
+vector of variables containing the values of all registered
+fields\footnote{This is sometimes called \emph{scalar replacement}. XXX check
+whether that's true}. If some of the fields are themselves references to
+allocation-removed objects they are recursively exploded
+to make the vector contain only concrete variables. Some care has
+to be taken to always place the fields in the same order when
+performing this explosion. Notation becomes somewhat simpler if also every
+concrete variable of the jump arguments is exploded into a vector containing
+itself. For
+every variable, $J_k$, of the original jump arguments, $J$, let
+\begin{equation}
+  \tilde J^{\left(k\right)} = \left\{
+      \begin{array}{ll}
+        \left(J_k\right)  & \text{if $J_k$ is concrete} \\
+        H^{\left(k\right)} & \text{if $J_k$ is allocation-removed}
+      \end{array}
+  \right.
+  ,
+\end{equation}
+where $H^{\left(k\right)}$ is a vector containing all concrete
+attributes of $J_k$. The arguments of the optimized \lstinline{jump}
+operation are constructed as the concatenation all the $\tilde J^{\left(k\right)}$ vectors,
+\begin{equation}
+  \hat J = \left( 
+    \begin{array}{cccc}
+      \tilde J^{\left(1\right)} & \tilde J^{\left(2\right)} & \cdots &
+      \tilde J^{\left(|J|\right)} \\
+    \end{array}
+  \right)      
+  .
+\end{equation}
+The arguments of the \lstinline{jump} operation of the peeled loop,
+$K$, is constructed by inlining $\hat J$,
+\begin{equation}
+  \hat K = \left(m\left(\hat J_1\right), m\left(\hat J_1\right), 
+                 \cdots, m\left(\hat J_{|\hat J|}\right)\right)
+  .
+\end{equation}
+In the optimized trace $I$ is replaced by $\hat I$ and $K$ by $\hat
+K$. The trace from Figure~\ref{fig:unopt-trace} will be optimized into
+
+\begin{lstlisting}[mathescape,numbers = right,basicstyle=\setstretch{1.05}\ttfamily\scriptsize]
+$L_0$($p_{0}$, $p_{1}$):
+# inside f: y = y.add(step)
+guard_class($p_{1}$, BoxedInteger)
+    # inside BoxedInteger.add
+    $i_{2}$ = get($p_{1}$, intval)
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{3}$ = get($p_{0}$, intval)
+        $i_{4}$ = $i_{2}+i_{3}$
+            # inside BoxedInteger.__init__
+jump($L_1$, $p_{0}$, $i_{4}$)
+
+$L_1$($p_{0}$, $i_{4}$):
+# inside f: y = y.add(step)
+    # inside BoxedInteger.add
+    guard_class($p_{0}$, BoxedInteger)
+        # inside BoxedInteger.add__int
+        $i_{7}$ = get($p_{0}$, intval)
+        $i_{8}$ = $i_{4}+i_{7}$
+            # inside BoxedInteger.__init__
+jump($L_1$, $p_{0}$, $i_8$)
+\end{lstlisting}
+
+If all the optimizations presented above are applied, the resulting
+optimized peeled loop will consist of a single integer addition
+only. That is it will become type-specialized to the types of the
+variables \lstinline{step} and \lstinline{y}, and the overhead of
+using boxed values is removed.
+
+\section{Benchmarks}
+
+The loop peeling optimization was implemented in the PyPy
+framework in about 450 lines of RPython code. That means that the JIT-compilers generated for all
+interpreters implemented within PyPy now can take advantage of
+it. Benchmarks have been executed for a few different interpreters and
+we see improvements in several cases. The ideal loop for this optimization
+would be short numerical calculations with no failing guards and no
+external calls. Larger loops involving many operations on complex objects
+typically benefit less from it. Loop peeling never makes runtime performance worse, in
+the worst case the peeled loop is exactly the same as the preamble. Therefore we
+chose to present benchmarks of small numeric kernels where loop peeling can show
+its use.
+
+\begin{figure}
+\begin{center}
+{\smaller
+\begin{tabular}{|l|r|r|r|r|r|r|}
+\hline
+ & CPython & Psyco & PyPy  & PyPy & GCC \\
+ &         &       & no LP &      & -O3 \\
+\hline
+conv3(1e5) & 77.89 & 9.52 & 1.77  & 0.68 &  0.59 \\
+\hline
+conv3(1e6) & 77.15 & 9.58 & 1.69  & 0.77 &  0.74 \\
+\hline
+conv3x3(1000) & 233.54 & 125.40 & 0.57 & 0.27 & 0.25 \\
+\hline
+conv3x3(3) & 234.45 & 126.28 & 0.60 & 0.31 & 0.28 \\
+\hline
+conv5(1e5) & 122.54 & 16.67 & 1.86  & 1.05 &  0.65\\
+\hline
+conv5(1e6) & 125.77 & 16.80 & 1.92 & 1.09 &  0.80 \\
+\hline
+dilate3x3(1000) & 232.51 & 125.85 & 3.89 & 3.69 & 0.25 \\
+\hline
+sobel(1000) & 181.49 & 95.05 & 0.71 & 0.42 & 0.20 \\
+\hline
+sqrt(Fix16) & 744.35 & 421.65 & 3.93  & 2.14  & 0.96 \\
+\hline
+sqrt(float) & 24.21 & 5.52 & 1.36 & 1.00 & 0.98\\
+\hline
+sqrt(int) & 20.84 & 1.78 & 2.26 & 1.82  & 0.80 \\
+\hline
+\hline
+Variations & - & - & $\pm 0.03$ & $\pm 0.01$ & $\pm 0.01$ \\
+\hline
+\end{tabular}
+}
+\end{center}
+\label{fig:benchmarks}
+\caption{Benchmark Results in Seconds. Arrays of length $10^5$ and
+  $10^6$ and matrixes of size $1000\times 1000$ and $1000000 \times
+  3$ are used. The one used in each benchmark is indicated in
+  the leftmost column. For the matrixes, only the number of rows are
+  specified.} 
+\end{figure}
+
+\subsection{Python}
+The Python interpreter of the PyPy framework is a complete Python
+version 2.7 compatible interpreter. A set of numerical
+calculations were implemented in both Python and in C and their
+runtimes are compared in Figure~\ref{fig:benchmarks}. The benchmarks are
+\begin{itemize}
+\item {\bf sqrt}: approximates the square root of $y$ as $x_\infty$
+  with $x_0=y/2$ and $x_k = \left( x_{k-1} + y/x_{k-1} \right) /
+  2$. There are three different versions of this benchmark where $x_k$
+  is represented with different type of objects: int's, float's and
+  Fix16's. The latter, Fix16, is a custom class that implements
+  fixpoint arithmetic with 16 bits precision. In Python there is only
+  a single implementation of the benchmark that gets specialized
+  depending on the class of it's input argument, $y$, while in C,
+  there are three different implementations.
+\item {\bf conv3}: one-dimensional convolution with fixed kernel-size $3$.
+\item {\bf conv5}: one-dimensional convolution with fixed kernel-size $5$.
+\item {\bf conv3x3}: two-dimensional convolution with kernel of fixed
+  size $3 \times 3$ using a custom class to represent two-dimensional
+  arrays.
+\item {\bf dilate3x3}: two-dimensional dilation with kernel of fixed
+  size $3 \times 3$. This is similar to convolution but instead of
+  summing over the elements, the maximum is taken. That places a
+  external call to a max function within the loop that prevents some
+  of the optimizations.
+\item {\bf sobel}: a low-level video processing algorithm used to
+  locate edges in an image. It calculates the gradient magnitude
+  using sobel derivatives. 
+\end{itemize}
+
+The sobel and conv3x3 benchmarks are implemented
+on top of a custom two-dimensional array class.
+It is
+a simple straight forward implementation providing 2 dimensionall
+indexing with out of bounds checks. For the C implementations it is
+implemented as a C++ class. The other benchmarks are implemented in
+plain C. 
+
+Benchmarks were run on Intel i7 M620 @2.67GHz with 4M cache and 8G of RAM in
+32bit mode.
+The machine was otherwise unoccupied. We use the following software
+for benchmarks:
+
+\begin{itemize}
+\item PyPy 1.5
+\item CPython 2.7.2
+\item Psyco 1.6 with CPython 2.6.6
+\item GCC 4.4.5 shipped with Ubuntu 11.4
+\end{itemize}
+
+We run GCC both with -O2 optimization and -O3 -march=native, disabling the
+automatic loop vectorization. In all cases, SSE2 instructions were used for
+floating point operations, except Psyco which uses x87 FPU instructions.
+We also run PyPy with loop peeling optimization and without (but otherwise
+identical).
+
+For PyPy 10 iterations were run, prefaced with 3 iterations for warming up.
+Due to benchmarks taking large amounts of time on CPython, only one run
+was performed, prefaced with one warmup run for Psyco.
+For GCC 5 iterations
+were run. In all cases, the standard deviation is very low, making benchmarks
+very well reproducible.
+
+We can observe that PyPy (even without loop peeling) is orders of magnitude
+faster than either CPython or Psyco. This is due to the JIT compilation
+advantages and optimizations we discussed in XXX [ref to other paper]. Loop
+peeling gives an additional XXX on average, which makes benchmark times
+comparable with native-compiled C code. Missing performance we attribute to
+the relative immaturity of PyPy's JIT assembler backend as well as missing
+optimizations, like instruction scheduling.
+
+Other interesting interpreters that are helped greatly by this
+optimization are for
+example our Prolog interpreter written in RPython, as well as numerical
+kernel used for array manipulation. The exact extent is out of scope for
+this paper.
+
+\section{Related Work}
+\label{sec:related}
+
+All the optimizations presented here are completely standard
+\cite{muchnick_advanced_1997}. XXX
+
+Mike Pall, the author of LuaJIT\footnote{\texttt{http://luajit.org/}} seems to
+have developped the described technique independently. There are no papers about
+LuaJIT but the author of it writes on a mailing list: "The LOOP pass does
+synthetic unrolling of the recorded IR, combining copy-substitution with
+redundancy elimination to achieve code hoisting. The unrolled and
+copy-substituted instructions are simply fed back into the compiler pipeline,
+which allows reuse of all optimizations for redundancy elimination. Loop
+recurrences are detected on-the-fly and a minimized set of PHIs is generated."
+\cite{pall_luajit_2009}
+
+SPUR \cite{bebenita_spur:_2010} implements loop-invariant code motion
+directly, by explicitly marking as loop-invariant all variables that stay the
+same along all looping paths and then moving all pure computation that depends
+only on these variables out of the loop. SPUR can also hoist loads out of the
+loop if nothing in the loop can ever write to the memory location. It can also
+move allocations out of the loop, but does not replace the object by its fields.
+This saves only the allocation, not the access to the object fields.
+
+
+XXX
+% section Related Work (end)
+
+\section{Conclusions}
+
+In this paper we have studied loop invariant code motion during trace
+compilation. We claim that loop peeling is a very convenient solution
+here since it fits well with other trace optimizations and does not require
+large changes to them. This approach improves the effect of standard
+optimizations such as redundant guard removal, common subexpression elimination
+and allocation removal. The most prominent effect is that they all become loop
+invariant code motion optimizations.
+
+By using several benchmarks we show that the proposed algorithm can
+significantly improve the run time of small loops containing numerical
+calculations. 
+
+The current approach still has some limitations which we plan to address in the
+future. In particular loop peeling works poorly in combination with trace
+trees or trace stitching. The side exits attached guards that fail often
+currently have to jump to the preamble which makes loops with several equally
+common paths less efficient than they could be.
+
+%\appendix
+%\section{Appendix Title}
+
+%This is the text of the appendix, if you need one.
+
+\acks
+
+Acknowledgments, if needed.
+
+% We recommend abbrvnat bibliography style.
+
+\bibliographystyle{abbrv}
+\bibliography{paper}
+
+\end{document}
diff --git a/talk/iwtc11/sigplanconf.cls b/talk/iwtc11/sigplanconf.cls
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/sigplanconf.cls
@@ -0,0 +1,1251 @@
+%-----------------------------------------------------------------------------
+%
+%               LaTeX Class/Style File
+%
+% Name:         sigplanconf.cls
+% Purpose:      A LaTeX 2e class file for SIGPLAN conference proceedings.
+%               This class file supercedes acm_proc_article-sp,
+%               sig-alternate, and sigplan-proc.
+%
+% Author:       Paul C. Anagnostopoulos
+%               Windfall Software
+%               978 371-2316
+%               sigplan-style [atsign] acm.org
+%
+% Created:      12 September 2004
+%
+% Revisions:    See end of file.
+%
+%-----------------------------------------------------------------------------
+
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{sigplanconf}[2010/05/24 v2.4 ACM SIGPLAN Proceedings]
+
+% The following few pages contain LaTeX programming extensions adapted
+% from the ZzTeX macro package.
+
+%                       Token Hackery
+%                       ----- -------
+
+
+\def \@expandaftertwice {\expandafter\expandafter\expandafter}
+\def \@expandafterthrice {\expandafter\expandafter\expandafter\expandafter
+                          \expandafter\expandafter\expandafter}
+
+% This macro discards the next token.
+
+\def \@discardtok #1{}%                                  token
+
+% This macro removes the `pt' following a dimension.
+
+{\catcode `\p = 12 \catcode `\t = 12
+
+\gdef \@remover #1pt{#1}
+
+} % \catcode
+
+% This macro extracts the contents of a macro and returns it as plain text.
+% Usage: \expandafter\@defof \meaning\macro\@mark
+
+\def \@defof #1:->#2\@mark{#2}
+
+%                       Control Sequence Names
+%                       ------- -------- -----
+
+
+\def \@name #1{%                                        {\tokens}
+  \csname \expandafter\@discardtok \string#1\endcsname}
+
+\def \@withname #1#2{%                                  {\command}{\tokens}
+  \expandafter#1\csname \expandafter\@discardtok \string#2\endcsname}
+
+%                       Flags (Booleans)
+%                       ----- ----------
+
+% The boolean literals \@true and \@false are appropriate for use with
+% the \if command, which tests the codes of the next two characters.
+
+\def \@true {TT}
+\def \@false {FL}
+
+\def \@setflag #1=#2{\edef #1{#2}}%              \flag = boolean
+
+%                       IF and Predicates
+%                       -- --- ----------
+
+% A "predicate" is a macro that returns \@true or \@false as its value.
+% Such values are suitable for use with the \if conditional.  For example:
+%
+%   \if \@oddp{\x} <then-clause> \else <else-clause> \fi
+
+% A predicate can be used with \@setflag as follows:
+%
+%   \@setflag \flag = {<predicate>}
+
+% Here are the predicates for TeX's repertoire of conditional
+% commands.  These might be more appropriately interspersed with
+% other definitions in this module, but what the heck.
+% Some additional "obvious" predicates are defined.
+
+\def \@eqlp   #1#2{\ifnum #1 = #2\@true \else \@false \fi}
+\def \@neqlp  #1#2{\ifnum #1 = #2\@false \else \@true \fi}
+\def \@lssp   #1#2{\ifnum #1 < #2\@true \else \@false \fi}
+\def \@gtrp   #1#2{\ifnum #1 > #2\@true \else \@false \fi}
+\def \@zerop  #1{\ifnum #1 = 0\@true \else \@false \fi}
+\def \@onep   #1{\ifnum #1 = 1\@true \else \@false \fi}
+\def \@posp   #1{\ifnum #1 > 0\@true \else \@false \fi}
+\def \@negp   #1{\ifnum #1 < 0\@true \else \@false \fi}
+\def \@oddp   #1{\ifodd #1\@true \else \@false \fi}
+\def \@evenp  #1{\ifodd #1\@false \else \@true \fi}
+\def \@rangep #1#2#3{\if \@orp{\@lssp{#1}{#2}}{\@gtrp{#1}{#3}}\@false \else
+                                                          \@true \fi}
+\def \@tensp  #1{\@rangep{#1}{10}{19}}
+
+\def \@dimeqlp   #1#2{\ifdim #1 = #2\@true \else \@false \fi}
+\def \@dimneqlp  #1#2{\ifdim #1 = #2\@false \else \@true \fi}
+\def \@dimlssp   #1#2{\ifdim #1 < #2\@true \else \@false \fi}
+\def \@dimgtrp   #1#2{\ifdim #1 > #2\@true \else \@false \fi}
+\def \@dimzerop  #1{\ifdim #1 = 0pt\@true \else \@false \fi}
+\def \@dimposp   #1{\ifdim #1 > 0pt\@true \else \@false \fi}
+\def \@dimnegp   #1{\ifdim #1 < 0pt\@true \else \@false \fi}
+
+\def \@vmodep     {\ifvmode \@true \else \@false \fi}
+\def \@hmodep     {\ifhmode \@true \else \@false \fi}
+\def \@mathmodep  {\ifmmode \@true \else \@false \fi}
+\def \@textmodep  {\ifmmode \@false \else \@true \fi}
+\def \@innermodep {\ifinner \@true \else \@false \fi}
+
+\long\def \@codeeqlp #1#2{\if #1#2\@true \else \@false \fi}
+
+\long\def \@cateqlp #1#2{\ifcat #1#2\@true \else \@false \fi}
+
+\long\def \@tokeqlp  #1#2{\ifx #1#2\@true \else \@false \fi}
+\long\def \@xtokeqlp #1#2{\expandafter\ifx #1#2\@true \else \@false \fi}
+
+\long\def \@definedp #1{%
+  \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname
+                   \relax \@false \else \@true \fi}
+
+\long\def \@undefinedp #1{%
+  \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname
+                   \relax \@true \else \@false \fi}
+
+\def \@emptydefp #1{\ifx #1\@empty \@true \else \@false \fi}%       {\name}
+
+\let \@emptylistp = \@emptydefp
+
+\long\def \@emptyargp #1{%                               {#n}
+  \@empargp #1\@empargq\@mark}
+\long\def \@empargp #1#2\@mark{%
+  \ifx #1\@empargq \@true \else \@false \fi}
+\def \@empargq {\@empargq}
+
+\def \@emptytoksp #1{%                                   {\tokenreg}
+  \expandafter\@emptoksp \the#1\@mark}
+
+\long\def \@emptoksp #1\@mark{\@emptyargp{#1}}
+
+\def \@voidboxp #1{\ifvoid #1\@true \else \@false \fi}
+\def \@hboxp #1{\ifhbox #1\@true \else \@false \fi}
+\def \@vboxp #1{\ifvbox #1\@true \else \@false \fi}
+
+\def \@eofp #1{\ifeof #1\@true \else \@false \fi}
+
+
+% Flags can also be used as predicates, as in:
+%
+%   \if \flaga <then-clause> \else <else-clause> \fi
+
+
+% Now here we have predicates for the common logical operators.
+
+\def \@notp #1{\if #1\@false \else \@true \fi}
+
+\def \@andp #1#2{\if #1%
+                  \if #2\@true \else \@false \fi
+                \else
+                  \@false
+                \fi}
+
+\def \@orp #1#2{\if #1%
+                 \@true
+               \else
+                 \if #2\@true \else \@false \fi
+               \fi}
+
+\def \@xorp #1#2{\if #1%
+                  \if #2\@false \else \@true \fi
+                \else
+                  \if #2\@true \else \@false \fi
+                \fi}
+
+%                       Arithmetic
+%                       ----------
+
+\def \@increment #1{\advance #1 by 1\relax}%             {\count}
+
+\def \@decrement #1{\advance #1 by -1\relax}%            {\count}
+
+%                       Options
+%                       -------
+
+
+\@setflag \@authoryear = \@false
+\@setflag \@blockstyle = \@false
+\@setflag \@copyrightwanted = \@true
+\@setflag \@explicitsize = \@false
+\@setflag \@mathtime = \@false
+\@setflag \@natbib = \@true
+\@setflag \@ninepoint = \@true
+\newcount{\@numheaddepth} \@numheaddepth = 3
+\@setflag \@onecolumn = \@false
+\@setflag \@preprint = \@false
+\@setflag \@reprint = \@false
+\@setflag \@tenpoint = \@false
+\@setflag \@times = \@false
+
+% Note that all the dangerous article class options are trapped.
+
+\DeclareOption{9pt}{\@setflag \@ninepoint = \@true
+                    \@setflag \@explicitsize = \@true}
+
+\DeclareOption{10pt}{\PassOptionsToClass{10pt}{article}%
+                     \@setflag \@ninepoint = \@false
+                     \@setflag \@tenpoint = \@true
+                     \@setflag \@explicitsize = \@true}
+
+\DeclareOption{11pt}{\PassOptionsToClass{11pt}{article}%
+                     \@setflag \@ninepoint = \@false
+                     \@setflag \@explicitsize = \@true}
+
+\DeclareOption{12pt}{\@unsupportedoption{12pt}}
+
+\DeclareOption{a4paper}{\@unsupportedoption{a4paper}}
+
+\DeclareOption{a5paper}{\@unsupportedoption{a5paper}}
+
+\DeclareOption{authoryear}{\@setflag \@authoryear = \@true}
+
+\DeclareOption{b5paper}{\@unsupportedoption{b5paper}}
+
+\DeclareOption{blockstyle}{\@setflag \@blockstyle = \@true}
+
+\DeclareOption{cm}{\@setflag \@times = \@false}
+
+\DeclareOption{computermodern}{\@setflag \@times = \@false}
+
+\DeclareOption{executivepaper}{\@unsupportedoption{executivepaper}}
+
+\DeclareOption{indentedstyle}{\@setflag \@blockstyle = \@false}
+
+\DeclareOption{landscape}{\@unsupportedoption{landscape}}
+
+\DeclareOption{legalpaper}{\@unsupportedoption{legalpaper}}
+
+\DeclareOption{letterpaper}{\@unsupportedoption{letterpaper}}
+
+\DeclareOption{mathtime}{\@setflag \@mathtime = \@true}
+
+\DeclareOption{natbib}{\@setflag \@natbib = \@true}
+
+\DeclareOption{nonatbib}{\@setflag \@natbib = \@false}
+
+\DeclareOption{nocopyrightspace}{\@setflag \@copyrightwanted = \@false}
+
+\DeclareOption{notitlepage}{\@unsupportedoption{notitlepage}}
+
+\DeclareOption{numberedpars}{\@numheaddepth = 4}
+
+\DeclareOption{numbers}{\@setflag \@authoryear = \@false}
+
+%%%\DeclareOption{onecolumn}{\@setflag \@onecolumn = \@true}
+
+\DeclareOption{preprint}{\@setflag \@preprint = \@true}
+
+\DeclareOption{reprint}{\@setflag \@reprint = \@true}
+
+\DeclareOption{times}{\@setflag \@times = \@true}
+
+\DeclareOption{titlepage}{\@unsupportedoption{titlepage}}
+
+\DeclareOption{twocolumn}{\@setflag \@onecolumn = \@false}
+
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+
+\ExecuteOptions{9pt,indentedstyle,times}
+\@setflag \@explicitsize = \@false
+\ProcessOptions
+
+\if \@onecolumn
+  \if \@notp{\@explicitsize}%
+    \@setflag \@ninepoint = \@false
+    \PassOptionsToClass{11pt}{article}%
+  \fi
+  \PassOptionsToClass{twoside,onecolumn}{article}
+\else
+  \PassOptionsToClass{twoside,twocolumn}{article}
+\fi
+\LoadClass{article}
+
+\def \@unsupportedoption #1{%
+  \ClassError{proc}{The standard '#1' option is not supported.}}
+
+% This can be used with the 'reprint' option to get the final folios.
+
+\def \setpagenumber #1{%
+  \setcounter{page}{#1}}
+
+\AtEndDocument{\label{sigplanconf at finalpage}}
+
+%                       Utilities
+%                       ---------
+
+
+\newcommand{\setvspace}[2]{%
+  #1 = #2
+  \advance #1 by -1\parskip}
+
+%                       Document Parameters
+%                       -------- ----------
+
+
+% Page:
+
+\setlength{\hoffset}{-1in}
+\setlength{\voffset}{-1in}
+
+\setlength{\topmargin}{1in}
+\setlength{\headheight}{0pt}
+\setlength{\headsep}{0pt}
+
+\if \@onecolumn
+  \setlength{\evensidemargin}{.75in}
+  \setlength{\oddsidemargin}{.75in}
+\else
+  \setlength{\evensidemargin}{.75in}
+  \setlength{\oddsidemargin}{.75in}
+\fi
+
+% Text area:
+
+\newdimen{\standardtextwidth}
+\setlength{\standardtextwidth}{42pc}
+
+\if \@onecolumn
+  \setlength{\textwidth}{40.5pc}
+\else
+  \setlength{\textwidth}{\standardtextwidth}
+\fi
+
+\setlength{\topskip}{8pt}
+\setlength{\columnsep}{2pc}
+\setlength{\textheight}{54.5pc}
+
+% Running foot:
+
+\setlength{\footskip}{30pt}
+
+% Paragraphs:
+
+\if \@blockstyle
+  \setlength{\parskip}{5pt plus .1pt minus .5pt}
+  \setlength{\parindent}{0pt}
+\else
+  \setlength{\parskip}{0pt}
+  \setlength{\parindent}{12pt}
+\fi
+
+\setlength{\lineskip}{.5pt}
+\setlength{\lineskiplimit}{\lineskip}
+
+\frenchspacing
+\pretolerance = 400
+\tolerance = \pretolerance
+\setlength{\emergencystretch}{5pt}
+\clubpenalty = 10000
+\widowpenalty = 10000
+\setlength{\hfuzz}{.5pt}
+
+% Standard vertical spaces:
+
+\newskip{\standardvspace}
+\setvspace{\standardvspace}{5pt plus 1pt minus .5pt}
+
+% Margin paragraphs:
+
+\setlength{\marginparwidth}{36pt}
+\setlength{\marginparsep}{2pt}
+\setlength{\marginparpush}{8pt}
+
+
+\setlength{\skip\footins}{8pt plus 3pt minus 1pt}
+\setlength{\footnotesep}{9pt}
+
+\renewcommand{\footnoterule}{%
+  \hrule width .5\columnwidth height .33pt depth 0pt}
+
+\renewcommand{\@makefntext}[1]{%
+  \noindent \@makefnmark \hspace{1pt}#1}
+
+% Floats:
+
+\setcounter{topnumber}{4}
+\setcounter{bottomnumber}{1}
+\setcounter{totalnumber}{4}
+
+\renewcommand{\fps at figure}{tp}
+\renewcommand{\fps at table}{tp}
+\renewcommand{\topfraction}{0.90}
+\renewcommand{\bottomfraction}{0.30}
+\renewcommand{\textfraction}{0.10}
+\renewcommand{\floatpagefraction}{0.75}
+
+\setcounter{dbltopnumber}{4}
+
+\renewcommand{\dbltopfraction}{\topfraction}
+\renewcommand{\dblfloatpagefraction}{\floatpagefraction}
+
+\setlength{\floatsep}{18pt plus 4pt minus 2pt}
+\setlength{\textfloatsep}{18pt plus 4pt minus 3pt}
+\setlength{\intextsep}{10pt plus 4pt minus 3pt}
+
+\setlength{\dblfloatsep}{18pt plus 4pt minus 2pt}
+\setlength{\dbltextfloatsep}{20pt plus 4pt minus 3pt}
+
+% Miscellaneous:
+
+\errorcontextlines = 5
+
+%                       Fonts
+%                       -----
+
+
+\if \@times
+  \renewcommand{\rmdefault}{ptm}%
+  \if \@mathtime
+    \usepackage[mtbold,noTS1]{mathtime}%
+  \else
+%%%    \usepackage{mathptm}%
+  \fi
+\else
+  \relax
+\fi
+
+\if \@ninepoint
+
+\renewcommand{\normalsize}{%
+  \@setfontsize{\normalsize}{9pt}{10pt}%
+  \setlength{\abovedisplayskip}{5pt plus 1pt minus .5pt}%
+  \setlength{\belowdisplayskip}{\abovedisplayskip}%
+  \setlength{\abovedisplayshortskip}{3pt plus 1pt minus 2pt}%
+  \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}}
+
+\renewcommand{\tiny}{\@setfontsize{\tiny}{5pt}{6pt}}
+
+\renewcommand{\scriptsize}{\@setfontsize{\scriptsize}{7pt}{8pt}}
+
+\renewcommand{\small}{%
+  \@setfontsize{\small}{8pt}{9pt}%
+  \setlength{\abovedisplayskip}{4pt plus 1pt minus 1pt}%
+  \setlength{\belowdisplayskip}{\abovedisplayskip}%
+  \setlength{\abovedisplayshortskip}{2pt plus 1pt}%
+  \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}}
+
+\renewcommand{\footnotesize}{%
+  \@setfontsize{\footnotesize}{8pt}{9pt}%
+  \setlength{\abovedisplayskip}{4pt plus 1pt minus .5pt}%
+  \setlength{\belowdisplayskip}{\abovedisplayskip}%
+  \setlength{\abovedisplayshortskip}{2pt plus 1pt}%
+  \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}}
+
+\renewcommand{\large}{\@setfontsize{\large}{11pt}{13pt}}
+
+\renewcommand{\Large}{\@setfontsize{\Large}{14pt}{18pt}}
+
+\renewcommand{\LARGE}{\@setfontsize{\LARGE}{18pt}{20pt}}
+
+\renewcommand{\huge}{\@setfontsize{\huge}{20pt}{25pt}}
+
+\renewcommand{\Huge}{\@setfontsize{\Huge}{25pt}{30pt}}
+
+\else\if \@tenpoint
+
+\relax
+
+\else
+
+\relax
+
+\fi\fi
+
+%                       Abstract
+%                       --------
+
+
+\renewenvironment{abstract}{%
+  \section*{Abstract}%
+  \normalsize}{%
+  }
+
+%                       Bibliography
+%                       ------------
+
+
+\renewenvironment{thebibliography}[1]
+     {\section*{\refname
+        \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}%
+      \list{\@biblabel{\@arabic\c at enumiv}}%
+           {\settowidth\labelwidth{\@biblabel{#1}}%
+            \leftmargin\labelwidth
+            \advance\leftmargin\labelsep
+            \@openbib at code
+            \usecounter{enumiv}%
+            \let\p at enumiv\@empty
+            \renewcommand\theenumiv{\@arabic\c at enumiv}}%
+      \bibfont
+      \clubpenalty4000
+      \@clubpenalty \clubpenalty
+      \widowpenalty4000%
+      \sfcode`\.\@m}
+     {\def\@noitemerr
+       {\@latex at warning{Empty `thebibliography' environment}}%
+      \endlist}
+
+\if \@natbib
+
+\if \@authoryear
+  \typeout{Using natbib package with 'authoryear' citation style.}
+  \usepackage[authoryear,sort,square]{natbib}
+  \bibpunct{[}{]}{;}{a}{}{,}    % Change citation separator to semicolon,
+                                % eliminate comma between author and year.
+  \let \cite = \citep
+\else
+  \typeout{Using natbib package with 'numbers' citation style.}
+  \usepackage[numbers,sort&compress,square]{natbib}
+\fi
+\setlength{\bibsep}{3pt plus .5pt minus .25pt}
+
+\fi
+
+\def \bibfont {\small}
+
+%                       Categories
+%                       ----------
+
+
+\@setflag \@firstcategory = \@true
+
+\newcommand{\category}[3]{%
+  \if \@firstcategory
+    \paragraph*{Categories and Subject Descriptors}%
+    \@setflag \@firstcategory = \@false
+  \else
+    \unskip ;\hspace{.75em}%
+  \fi
+  \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}}
+
+\def \@category #1#2#3[#4]{%
+  {\let \and = \relax
+   #1 [\textit{#2}]%
+   \if \@emptyargp{#4}%
+     \if \@notp{\@emptyargp{#3}}: #3\fi
+   \else
+     :\space
+     \if \@notp{\@emptyargp{#3}}#3---\fi
+     \textrm{#4}%
+   \fi}}
+
+%                       Copyright Notice
+%                       --------- ------
+
+
+\def \ftype at copyrightbox {8}
+\def \@toappear {}
+\def \@permission {}
+\def \@reprintprice {}
+
+\def \@copyrightspace {%
+  \@float{copyrightbox}[b]%
+  \vbox to 1in{%
+    \vfill
+    \parbox[b]{20pc}{%
+      \scriptsize
+      \if \@preprint
+        [Copyright notice will appear here
+         once 'preprint' option is removed.]\par
+      \else
+        \@toappear
+      \fi
+      \if \@reprint
+        \noindent Reprinted from \@conferencename,
+        \@proceedings,
+        \@conferenceinfo,
+        pp.~\number\thepage--\pageref{sigplanconf at finalpage}.\par
+      \fi}}%
+  \end at float}
+
+\long\def \toappear #1{%
+  \def \@toappear {#1}}
+
+\toappear{%
+  \noindent \@permission \par
+  \vspace{2pt}
+  \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par
+  \noindent Copyright \copyright\ \@copyrightyear\ ACM \@copyrightdata
+    \dots \@reprintprice\par}
+
+\newcommand{\permission}[1]{%
+  \gdef \@permission {#1}}
+
+\permission{%
+  Permission to make digital or hard copies of all or
+  part of this work for personal or classroom use is granted without
+  fee provided that copies are not made or distributed for profit or
+  commercial advantage and that copies bear this notice and the full
+  citation on the first page.  To copy otherwise, to republish, to
+  post on servers or to redistribute to lists, requires prior specific
+  permission and/or a fee.}
+
+% Here we have some alternate permission statements and copyright lines:
+
+\newcommand{\ACMCanadapermission}{%
+  \permission{%
+    Copyright \@copyrightyear\ Association for Computing Machinery.
+    ACM acknowledges that
+    this contribution was authored or co-authored by an affiliate of the
+    National Research Council of Canada (NRC).
+    As such, the Crown in Right of
+    Canada retains an equal interest in the copyright, however granting
+    nonexclusive, royalty-free right to publish or reproduce this article,
+    or to allow others to do so, provided that clear attribution
+    is also given to the authors and the NRC.}}
+
+\newcommand{\ACMUSpermission}{%
+  \permission{%
+    Copyright \@copyrightyear\ Association for
+    Computing Machinery. ACM acknowledges that
+    this contribution was authored or co-authored
+    by a contractor or affiliate
+    of the U.S. Government. As such, the Government retains a nonexclusive,
+    royalty-free right to publish or reproduce this article,
+    or to allow others to do so, for Government purposes only.}}
+
+\newcommand{\authorpermission}{%
+  \permission{%
+    Copyright is held by the author/owner(s).}
+  \toappear{%
+    \noindent \@permission \par
+    \vspace{2pt}
+    \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par
+    ACM \@copyrightdata.}}
+
+\newcommand{\Sunpermission}{%
+  \permission{%
+    Copyright is held by Sun Microsystems, Inc.}%
+  \toappear{%
+    \noindent \@permission \par
+    \vspace{2pt}
+    \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par
+    ACM \@copyrightdata.}}
+
+\newcommand{\USpublicpermission}{%
+  \permission{%
+    This paper is authored by an employee(s) of the United States
+    Government and is in the public domain.}%
+  \toappear{%
+    \noindent \@permission \par
+    \vspace{2pt}
+    \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par
+    ACM \@copyrightdata.}}
+
+\newcommand{\reprintprice}[1]{%
+  \gdef \@reprintprice {#1}}
+
+\reprintprice{\$10.00}
+
+%                       Enunciations
+%                       ------------
+
+
+\def \@begintheorem #1#2{%                      {name}{number}
+  \trivlist
+  \item[\hskip \labelsep \textsc{#1 #2.}]%
+  \itshape\selectfont
+  \ignorespaces}
+
+\def \@opargbegintheorem #1#2#3{%               {name}{number}{title}
+  \trivlist
+  \item[%
+    \hskip\labelsep \textsc{#1\ #2}%
+    \if \@notp{\@emptyargp{#3}}\nut (#3).\fi]%
+  \itshape\selectfont
+  \ignorespaces}
+
+%                       Figures
+%                       -------
+
+
+\@setflag \@caprule = \@true
+
+\long\def \@makecaption #1#2{%
+  \addvspace{4pt}
+  \if \@caprule
+    \hrule width \hsize height .33pt
+    \vspace{4pt}
+  \fi
+  \setbox \@tempboxa = \hbox{\@setfigurenumber{#1.}\nut #2}%
+  \if \@dimgtrp{\wd\@tempboxa}{\hsize}%
+    \noindent \@setfigurenumber{#1.}\nut #2\par
+  \else
+    \centerline{\box\@tempboxa}%
+  \fi}
+
+\newcommand{\nocaptionrule}{%
+  \@setflag \@caprule = \@false}
+
+\def \@setfigurenumber #1{%
+  {\rmfamily \bfseries \selectfont #1}}
+
+%                       Hierarchy
+%                       ---------
+
+
+\setcounter{secnumdepth}{\@numheaddepth}
+
+\newskip{\@sectionaboveskip}
+\setvspace{\@sectionaboveskip}{10pt plus 3pt minus 2pt}
+
+\newskip{\@sectionbelowskip}
+\if \@blockstyle
+  \setlength{\@sectionbelowskip}{0.1pt}%
+\else
+  \setlength{\@sectionbelowskip}{4pt}%
+\fi
+
+\renewcommand{\section}{%
+  \@startsection
+    {section}%
+    {1}%
+    {0pt}%
+    {-\@sectionaboveskip}%
+    {\@sectionbelowskip}%
+    {\large \bfseries \raggedright}}
+
+\newskip{\@subsectionaboveskip}
+\setvspace{\@subsectionaboveskip}{8pt plus 2pt minus 2pt}
+
+\newskip{\@subsectionbelowskip}
+\if \@blockstyle
+  \setlength{\@subsectionbelowskip}{0.1pt}%
+\else
+  \setlength{\@subsectionbelowskip}{4pt}%
+\fi
+
+\renewcommand{\subsection}{%
+  \@startsection%
+    {subsection}%
+    {2}%
+    {0pt}%
+    {-\@subsectionaboveskip}%
+    {\@subsectionbelowskip}%
+    {\normalsize \bfseries \raggedright}}
+
+\renewcommand{\subsubsection}{%
+  \@startsection%
+    {subsubsection}%
+    {3}%
+    {0pt}%
+    {-\@subsectionaboveskip}
+    {\@subsectionbelowskip}%
+    {\normalsize \bfseries \raggedright}}
+
+\newskip{\@paragraphaboveskip}
+\setvspace{\@paragraphaboveskip}{6pt plus 2pt minus 2pt}
+
+\renewcommand{\paragraph}{%
+  \@startsection%
+    {paragraph}%
+    {4}%
+    {0pt}%
+    {\@paragraphaboveskip}
+    {-1em}%
+    {\normalsize \bfseries \if \@times \itshape \fi}}
+
+\renewcommand{\subparagraph}{%
+  \@startsection%
+    {subparagraph}%
+    {4}%
+    {0pt}%
+    {\@paragraphaboveskip}
+    {-1em}%
+    {\normalsize \itshape}}
+
+% Standard headings:
+
+\newcommand{\acks}{\section*{Acknowledgments}}
+
+\newcommand{\keywords}{\paragraph*{Keywords}}
+
+\newcommand{\terms}{\paragraph*{General Terms}}
+
+%                       Identification
+%                       --------------
+
+
+\def \@conferencename {}
+\def \@conferenceinfo {}
+\def \@copyrightyear {}
+\def \@copyrightdata {[to be supplied]}
+\def \@proceedings {[Unknown Proceedings]}
+
+
+\newcommand{\conferenceinfo}[2]{%
+  \gdef \@conferencename {#1}%
+  \gdef \@conferenceinfo {#2}}
+
+\newcommand{\copyrightyear}[1]{%
+  \gdef \@copyrightyear {#1}}
+
+\let \CopyrightYear = \copyrightyear
+
+\newcommand{\copyrightdata}[1]{%
+  \gdef \@copyrightdata {#1}}
+
+\let \crdata = \copyrightdata
+
+\newcommand{\proceedings}[1]{%
+  \gdef \@proceedings {#1}}
+
+%                       Lists
+%                       -----
+
+
+\setlength{\leftmargini}{13pt}
+\setlength\leftmarginii{13pt}
+\setlength\leftmarginiii{13pt}
+\setlength\leftmarginiv{13pt}
+\setlength{\labelsep}{3.5pt}
+
+\setlength{\topsep}{\standardvspace}
+\if \@blockstyle
+  \setlength{\itemsep}{1pt}
+  \setlength{\parsep}{3pt}
+\else
+  \setlength{\itemsep}{1pt}
+  \setlength{\parsep}{3pt}
+\fi
+
+\renewcommand{\labelitemi}{{\small \centeroncapheight{\textbullet}}}
+\renewcommand{\labelitemii}{\centeroncapheight{\rule{2.5pt}{2.5pt}}}
+\renewcommand{\labelitemiii}{$-$}
+\renewcommand{\labelitemiv}{{\Large \textperiodcentered}}
+
+\renewcommand{\@listi}{%
+  \leftmargin = \leftmargini
+  \listparindent = 0pt}
+%%%  \itemsep = 1pt
+%%%  \parsep = 3pt}
+%%%  \listparindent = \parindent}
+
+\let \@listI = \@listi
+
+\renewcommand{\@listii}{%
+  \leftmargin = \leftmarginii
+  \topsep = 1pt
+  \labelwidth = \leftmarginii
+  \advance \labelwidth by -\labelsep
+  \listparindent = \parindent}
+
+\renewcommand{\@listiii}{%
+  \leftmargin = \leftmarginiii
+  \labelwidth = \leftmarginiii
+  \advance \labelwidth by -\labelsep
+  \listparindent = \parindent}
+
+\renewcommand{\@listiv}{%
+  \leftmargin = \leftmarginiv
+  \labelwidth = \leftmarginiv
+  \advance \labelwidth by -\labelsep
+  \listparindent = \parindent}
+
+%                       Mathematics
+%                       -----------
+
+
+\def \theequation {\arabic{equation}}
+
+%                       Miscellaneous
+%                       -------------
+
+
+\newcommand{\balancecolumns}{%
+  \vfill\eject
+  \global\@colht = \textheight
+  \global\ht\@cclv = \textheight}
+
+\newcommand{\nut}{\hspace{.5em}}
+
+\newcommand{\softraggedright}{%
+  \let \\ = \@centercr
+  \leftskip = 0pt
+  \rightskip = 0pt plus 10pt}
+
+%                       Program Code
+%                       ------- ----
+
+
+\newcommand{\mono}[1]{%
+  {\@tempdima = \fontdimen2\font
+   \texttt{\spaceskip = 1.1\@tempdima #1}}}
+
+%                       Running Heads and Feet
+%                       ------- ----- --- ----
+
+
+\def \@preprintfooter {}
+
+\newcommand{\preprintfooter}[1]{%
+  \gdef \@preprintfooter {#1}}
+
+\if \@preprint
+
+\def \ps at plain {%
+  \let \@mkboth = \@gobbletwo
+  \let \@evenhead = \@empty
+  \def \@evenfoot {\scriptsize \textit{\@preprintfooter}\hfil \thepage \hfil
+                   \textit{\@formatyear}}%
+  \let \@oddhead = \@empty
+  \let \@oddfoot = \@evenfoot}
+
+\else\if \@reprint
+
+\def \ps at plain {%
+  \let \@mkboth = \@gobbletwo
+  \let \@evenhead = \@empty
+  \def \@evenfoot {\scriptsize \hfil \thepage \hfil}%
+  \let \@oddhead = \@empty
+  \let \@oddfoot = \@evenfoot}
+
+\else
+
+\let \ps at plain = \ps at empty
+\let \ps at headings = \ps at empty
+\let \ps at myheadings = \ps at empty
+
+\fi\fi
+
+\def \@formatyear {%
+  \number\year/\number\month/\number\day}
+
+%                       Special Characters
+%                       ------- ----------
+
+
+\DeclareRobustCommand{\euro}{%
+  \protect{\rlap{=}}{\sf \kern .1em C}}
+
+%                       Title Page
+%                       ----- ----
+
+
+\@setflag \@addauthorsdone = \@false
+
+\def \@titletext {\@latex at error{No title was provided}{}}
+\def \@subtitletext {}
+
+\newcount{\@authorcount}
+
+\newcount{\@titlenotecount}
+\newtoks{\@titlenotetext}
+
+\def \@titlebanner {}
+
+\renewcommand{\title}[1]{%
+  \gdef \@titletext {#1}}
+
+\newcommand{\subtitle}[1]{%
+  \gdef \@subtitletext {#1}}
+
+\newcommand{\authorinfo}[3]{%           {names}{affiliation}{email/URL}
+  \global\@increment \@authorcount
+  \@withname\gdef {\@authorname\romannumeral\@authorcount}{#1}%
+  \@withname\gdef {\@authoraffil\romannumeral\@authorcount}{#2}%
+  \@withname\gdef {\@authoremail\romannumeral\@authorcount}{#3}}
+
+\renewcommand{\author}[1]{%
+  \@latex at error{The \string\author\space command is obsolete;
+                use \string\authorinfo}{}}
+
+\newcommand{\titlebanner}[1]{%
+  \gdef \@titlebanner {#1}}
+
+\renewcommand{\maketitle}{%
+  \pagestyle{plain}%
+  \if \@onecolumn
+    {\hsize = \standardtextwidth
+     \@maketitle}%
+  \else
+    \twocolumn[\@maketitle]%
+  \fi
+  \@placetitlenotes
+  \if \@copyrightwanted \@copyrightspace \fi}
+
+\def \@maketitle {%
+  \begin{center}
+  \@settitlebanner
+  \let \thanks = \titlenote
+  {\leftskip = 0pt plus 0.25\linewidth
+   \rightskip = 0pt plus 0.25 \linewidth
+   \parfillskip = 0pt
+   \spaceskip = .7em
+   \noindent \LARGE \bfseries \@titletext \par}
+  \vskip 6pt
+  \noindent \Large \@subtitletext \par
+  \vskip 12pt
+  \ifcase \@authorcount
+    \@latex at error{No authors were specified for this paper}{}\or
+    \@titleauthors{i}{}{}\or
+    \@titleauthors{i}{ii}{}\or
+    \@titleauthors{i}{ii}{iii}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{viii}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{viii}{ix}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{}\or
+    \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}%
+                  \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{xii}%
+  \else
+    \@latex at error{Cannot handle more than 12 authors}{}%
+  \fi
+  \vspace{1.75pc}
+  \end{center}}
+
+\def \@settitlebanner {%
+  \if \@andp{\@preprint}{\@notp{\@emptydefp{\@titlebanner}}}%
+    \vbox to 0pt{%
+      \vskip -32pt
+      \noindent \textbf{\@titlebanner}\par
+      \vss}%
+    \nointerlineskip
+  \fi}
+
+\def \@titleauthors #1#2#3{%
+  \if \@andp{\@emptyargp{#2}}{\@emptyargp{#3}}%
+    \noindent \@setauthor{40pc}{#1}{\@false}\par
+  \else\if \@emptyargp{#3}%
+    \noindent \@setauthor{17pc}{#1}{\@false}\hspace{3pc}%
+              \@setauthor{17pc}{#2}{\@false}\par
+  \else
+    \noindent \@setauthor{12.5pc}{#1}{\@false}\hspace{2pc}%
+              \@setauthor{12.5pc}{#2}{\@false}\hspace{2pc}%
+              \@setauthor{12.5pc}{#3}{\@true}\par
+    \relax
+  \fi\fi
+  \vspace{20pt}}
+
+\def \@setauthor #1#2#3{%                       {width}{text}{unused}
+  \vtop{%
+    \def \and {%
+      \hspace{16pt}}
+    \hsize = #1
+    \normalfont
+    \centering
+    \large \@name{\@authorname#2}\par
+    \vspace{5pt}
+    \normalsize \@name{\@authoraffil#2}\par
+    \vspace{2pt}
+    \textsf{\@name{\@authoremail#2}}\par}}
+
+\def \@maybetitlenote #1{%
+  \if \@andp{#1}{\@gtrp{\@authorcount}{3}}%
+    \titlenote{See page~\pageref{@addauthors} for additional authors.}%
+  \fi}
+
+\newtoks{\@fnmark}
+
+\newcommand{\titlenote}[1]{%
+  \global\@increment \@titlenotecount
+  \ifcase \@titlenotecount \relax \or
+    \@fnmark = {\ast}\or
+    \@fnmark = {\dagger}\or
+    \@fnmark = {\ddagger}\or
+    \@fnmark = {\S}\or
+    \@fnmark = {\P}\or
+    \@fnmark = {\ast\ast}%
+  \fi
+  \,$^{\the\@fnmark}$%
+  \edef \reserved at a {\noexpand\@appendtotext{%
+                       \noexpand\@titlefootnote{\the\@fnmark}}}%
+  \reserved at a{#1}}
+
+\def \@appendtotext #1#2{%
+  \global\@titlenotetext = \expandafter{\the\@titlenotetext #1{#2}}}
+
+\newcount{\@authori}
+
+\iffalse
+\def \additionalauthors {%
+  \if \@gtrp{\@authorcount}{3}%
+    \section{Additional Authors}%
+    \label{@addauthors}%
+    \noindent
+    \@authori = 4
+    {\let \\ = ,%
+     \loop 
+       \textbf{\@name{\@authorname\romannumeral\@authori}},
+       \@name{\@authoraffil\romannumeral\@authori},
+       email: \@name{\@authoremail\romannumeral\@authori}.%
+       \@increment \@authori
+     \if \@notp{\@gtrp{\@authori}{\@authorcount}} \repeat}%
+    \par
+  \fi
+  \global\@setflag \@addauthorsdone = \@true}
+\fi
+
+\let \addauthorsection = \additionalauthors
+
+\def \@placetitlenotes {
+  \the\@titlenotetext}
+
+%                       Utilities
+%                       ---------
+
+
+\newcommand{\centeroncapheight}[1]{%
+  {\setbox\@tempboxa = \hbox{#1}%
+   \@measurecapheight{\@tempdima}%         % Calculate ht(CAP) - ht(text)
+   \advance \@tempdima by -\ht\@tempboxa   %           ------------------
+   \divide \@tempdima by 2                 %                   2
+   \raise \@tempdima \box\@tempboxa}}
+
+\newbox{\@measbox}
+
+\def \@measurecapheight #1{%                            {\dimen}
+  \setbox\@measbox = \hbox{ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
+  #1 = \ht\@measbox}
+
+\long\def \@titlefootnote #1#2{%
+  \insert\footins{%
+    \reset at font\footnotesize
+    \interlinepenalty\interfootnotelinepenalty
+    \splittopskip\footnotesep
+    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+    \hsize\columnwidth \@parboxrestore
+%%%    \protected at edef\@currentlabel{%
+%%%       \csname p at footnote\endcsname\@thefnmark}%
+    \color at begingroup
+      \def \@makefnmark {$^{#1}$}%
+      \@makefntext{%
+        \rule\z@\footnotesep\ignorespaces#2\@finalstrut\strutbox}%
+    \color at endgroup}}
+
+%                       LaTeX Modifications
+%                       ----- -------------
+
+\def \@seccntformat #1{%
+  \@name{\the#1}%
+  \@expandaftertwice\@seccntformata \csname the#1\endcsname.\@mark
+  \quad}
+
+\def \@seccntformata #1.#2\@mark{%
+  \if \@emptyargp{#2}.\fi}
+
+%                       Revision History
+%                       -------- -------
+
+
+%  Date         Person  Ver.    Change
+%  ----         ------  ----    ------
+
+%  2004.09.12   PCA     0.1--5  Preliminary development.
+
+%  2004.11.18   PCA     0.5     Start beta testing.
+
+%  2004.11.19   PCA     0.6     Obsolete \author and replace with
+%                               \authorinfo.
+%                               Add 'nocopyrightspace' option.
+%                               Compress article opener spacing.
+%                               Add 'mathtime' option.
+%                               Increase text height by 6 points.
+
+%  2004.11.28   PCA     0.7     Add 'cm/computermodern' options.
+%                               Change default to Times text.
+
+%  2004.12.14   PCA     0.8     Remove use of mathptm.sty; it cannot
+%                               coexist with latexsym or amssymb.
+
+%  2005.01.20   PCA     0.9     Rename class file to sigplanconf.cls.
+
+%  2005.03.05   PCA     0.91    Change default copyright data.
+
+%  2005.03.06   PCA     0.92    Add at-signs to some macro names.
+
+%  2005.03.07   PCA     0.93    The 'onecolumn' option defaults to '11pt',
+%                               and it uses the full type width.
+
+%  2005.03.15   PCA     0.94    Add at-signs to more macro names.
+%                               Allow margin paragraphs during review.
+
+%  2005.03.22   PCA     0.95    Implement \euro.
+%                               Remove proof and newdef environments.
+
+%  2005.05.06   PCA     1.0     Eliminate 'onecolumn' option.
+%                               Change footer to small italic and eliminate
+%                               left portion if no \preprintfooter.
+%                               Eliminate copyright notice if preprint.
+%                               Clean up and shrink copyright box.
+
+%  2005.05.30   PCA     1.1     Add alternate permission statements.
+
+%  2005.06.29   PCA     1.1     Publish final first edition of guide.
+
+%  2005.07.14   PCA     1.2     Add \subparagraph.
+%                               Use block paragraphs in lists, and adjust
+%                               spacing between items and paragraphs.
+
+%  2006.06.22   PCA     1.3     Add 'reprint' option and associated
+%                               commands.
+
+%  2006.08.24   PCA     1.4     Fix bug in \maketitle case command.
+
+%  2007.03.13   PCA     1.5     The title banner only displays with the
+%                               'preprint' option.
+
+%  2007.06.06   PCA     1.6     Use \bibfont in \thebibliography.
+%                               Add 'natbib' option to load and configure
+%                                 the natbib package.
+
+%  2007.11.20   PCA     1.7     Balance line lengths in centered article
+%                                 title (thanks to Norman Ramsey).
+
+%  2009.01.26   PCA     1.8     Change natbib \bibpunct values.
+
+%  2009.03.24   PCA     1.9     Change natbib to use the 'numbers' option.
+%                               Change templates to use 'natbib' option.
+
+%  2009.09.01   PCA     2.0     Add \reprintprice command (suggested by
+%                                 Stephen Chong).
+
+%  2009.09.08   PCA     2.1     Make 'natbib' the default; add 'nonatbib'.
+%               SB              Add 'authoryear' and 'numbers' (default) to
+%                               control citation style when using natbib.
+%                               Add \bibpunct to change punctuation for
+%                               'authoryear' style.
+
+%  2009.09.21   PCA     2.2     Add \softraggedright to the thebibliography
+%                               environment. Also add to template so it will
+%                               happen with natbib.
+
+%  2009.09.30   PCA     2.3     Remove \softraggedright from thebibliography.  
+%                               Just include in the template.
+
+%  2010.05.24   PCA     2.4     Obfuscate author's email address.
diff --git a/talk/rst2beamer-template/beamerdefs.txt b/talk/rst2beamer-template/beamerdefs.txt
--- a/talk/rst2beamer-template/beamerdefs.txt
+++ b/talk/rst2beamer-template/beamerdefs.txt
@@ -20,6 +20,17 @@
 
    }
 
+.. |scriptsize| raw:: latex
+
+   {\scriptsize
+
+.. |end_scriptsize| raw:: latex
+
+   }
+
+.. |strike<| raw:: latex
+
+   \sout{
 
 .. closed bracket
 .. ===========================
@@ -75,3 +86,23 @@
 
       \end{column}
    \end{columns}
+
+
+
+.. |snake| image:: ../../img/py-web-new.png
+           :scale: 15%
+           
+
+
+.. nested blocks
+.. ===========================
+
+.. |nested| raw:: latex
+
+   \begin{columns}
+      \begin{column}{0.85\textwidth}
+
+.. |end_nested| raw:: latex
+
+      \end{column}
+   \end{columns}


More information about the pypy-commit mailing list