[z3-checkins] r12456 - in z3/deliverance/trunk: . doc examples
examples/plonenet examples/plonenet/content
examples/plonenet/content/tmp examples/plonenet/etc
examples/plonenet/lib examples/plonenet/static
examples/plonenet/static/ie7
examples/plonenet/static/ie7/compatibility
examples/plonenet/static/ie7/compatibility/complexspiral
examples/plonenet/static/ie7/src examples/plonenet/themes
paul at codespeak.net
paul at codespeak.net
Wed May 18 18:42:31 CEST 2005
Author: paul
Date: Wed May 18 18:42:30 2005
New Revision: 12456
Added:
z3/deliverance/trunk/
z3/deliverance/trunk/INSTALL.txt
z3/deliverance/trunk/README.txt
z3/deliverance/trunk/doc/
z3/deliverance/trunk/doc/INTRO.txt
z3/deliverance/trunk/examples/
z3/deliverance/trunk/examples/plonenet/
z3/deliverance/trunk/examples/plonenet/content/
z3/deliverance/trunk/examples/plonenet/content/compiled-plonenettheme.xml
z3/deliverance/trunk/examples/plonenet/content/echo123.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/content/index.xsl (contents, props changed)
z3/deliverance/trunk/examples/plonenet/content/pfdata.sxc (contents, props changed)
z3/deliverance/trunk/examples/plonenet/content/plonenettheme.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/content/tmp/
z3/deliverance/trunk/examples/plonenet/content/tmp/content.xml
z3/deliverance/trunk/examples/plonenet/content/tmp/meta.xml
z3/deliverance/trunk/examples/plonenet/content/tmp/pfdata-bak.sxc (contents, props changed)
z3/deliverance/trunk/examples/plonenet/content/tmp/pfdata.xml
z3/deliverance/trunk/examples/plonenet/dvfilter.py
z3/deliverance/trunk/examples/plonenet/dvhandler.py
z3/deliverance/trunk/examples/plonenet/etc/
z3/deliverance/trunk/examples/plonenet/etc/plonenet.conf
z3/deliverance/trunk/examples/plonenet/etc/themerules.xml
z3/deliverance/trunk/examples/plonenet/lib/
z3/deliverance/trunk/examples/plonenet/lib/__init__.py
z3/deliverance/trunk/examples/plonenet/lib/compiletheme.sh
z3/deliverance/trunk/examples/plonenet/lib/plonenetlib.py
z3/deliverance/trunk/examples/plonenet/lib/sxcfile.py
z3/deliverance/trunk/examples/plonenet/lib/sxctransformer.xsl
z3/deliverance/trunk/examples/plonenet/lib/themecompiler.xsl
z3/deliverance/trunk/examples/plonenet/lib/themeinputdoc.xsl
z3/deliverance/trunk/examples/plonenet/static/
z3/deliverance/trunk/examples/plonenet/static/ie7/
z3/deliverance/trunk/examples/plonenet/static/ie7/README.txt (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/blank.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/Pure CSS Menus (nearly).html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/Pure CSS Menus.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/abbr.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/active.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/active.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/active.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/adjacent.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/adjacent.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/adjacent.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/after.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-begin.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-contains.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-dash-list.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-dash-list.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-dash-list.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-end.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-list.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-list.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-list.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-value.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-value.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr-value.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/attr.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/background-fixed.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/before.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/blue.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/bluething.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/bluething_fade.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/bottom-left.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/bottom-right.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/box-sizing.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/button.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/child.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/child.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/comment-bug.htm (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/bigben-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/demo.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/demo2.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/flower-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/glassy-bg.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/glassy-gray.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/glassy-ripple.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/glassy-tan.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/glassy.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/halfscr-black.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/halfscr-blue.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/halfscr-white.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/lightning-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell-bg.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell-blue.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell-fade.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell-wash.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shell2-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/complexspiral/shuttle-bg.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/content.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/empty.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/empty.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/empty.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/first-child.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/first-child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/first-child.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/fixed.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/float.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/focus.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/focus.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/focus.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/form.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/green.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/horizontal-gauge.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/hover.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/hover.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/hover.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/ie7-demo.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/imports.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/imports.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/indirect.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/indirect.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/indirect.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/label.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/lang.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/last-child.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/last-child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/last-child.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/left-right.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/max-width.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/min-height.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/min-width.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/multiple-classes-bug.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/multiple-classes.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/multiple-classes.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/multiple-classes.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/multiple-pseudo-classes.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/nth-child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/nth-last-child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/only-child.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/png-background.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/png.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/png.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/png.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/purple_stucco.jpg (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/red.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/root.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/root.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/root.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/suite.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/super-dynamic.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/super.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/super.xml (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/test.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/top-bottom.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/top-left.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/top-right.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/tukan-trans.png (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/unscrollable.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/compatibility/vertical-gauge.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/configure.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-box-model.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-content.htm (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-core.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-css-strict.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-css2.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-css3.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-fixed.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-html4.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-ie5.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-lite-p.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-lite.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-logo.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-png.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-server.css (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-standard-p.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7-standard.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/ie7.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/index.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/install.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/license (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-box-model.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-content.htm (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-core.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-css-strict.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-css2.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-css3.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-fixed.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-html4.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-ie5.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-lite.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-png.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/src/ie7-standard.js (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/test-trans.png (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/test.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/ie7/usage.html (contents, props changed)
z3/deliverance/trunk/examples/plonenet/static/plonenet.css
z3/deliverance/trunk/examples/plonenet/static/site_icon.gif (contents, props changed)
z3/deliverance/trunk/examples/plonenet/themes/
Log:
First checkin of a working, documented setup
Added: z3/deliverance/trunk/INSTALL.txt
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/INSTALL.txt Wed May 18 18:42:30 2005
@@ -0,0 +1,69 @@
+======================
+Setting up Deliverance
+======================
+
+The whole idea of Deliverance is that it *shouldn't* be a system.
+It's just a thin approach that leverages some serious work being done
+by others. In this case, Deliverance gets most of its value from:
+
+ o Apache. Don't fight it, love it! Yeh, baby!
+
+ o mod_python for both handlers and filters.
+
+ o lxml and thus libxml2/libxslt. This is 90% of the value
+ proposition.
+
+mod_python
+----------
+
+1) Grab mod_python.
+
+2) Make sure you can do this:
+
+ http://www.modpython.org/live/current/doc-html/inst-testing.html
+
+3) Make sure Apache can read/write to the Deliverance examples directory.
+
+
+lxml
+-----
+
+1) Get 0.6 or later of lxml:
+
+ http://codespeak.net/lxml
+
+2) Make sure you can run some of the tests.
+
+3) Make sure you install it using the same Python used in mod_python.
+ To confirm, put:
+
+ import lxml.etree
+
+...in the mptest.py module used in the mod_python Testing example.
+
+
+Deliverance
+-----------
+
+1) Put a line like this:
+
+ Include /Users/paul/projects/deliverance/examples/plonenet/etc/plonenet.conf
+
+...in your Apache http.conf file.
+
+2) Edit that plonenet.conf file:
+
+ a. Change the Alias and Location lines to something meaningful.
+
+ b. Makes sure the LoadModule points at the right mod_python.
+
+ c. Fix the PythonPath line.
+
+3) Restart Apache.
+
+4) Go to the URL you put for the Location in the conf file and add
+ "/echo123" on the URL.
+
+You should see the sample file (content/echo123.xml) with the plonenet
+theme. If not, check the Apache error log for details. Possibly the
+web page will return a useful error message.
Added: z3/deliverance/trunk/README.txt
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/README.txt Wed May 18 18:42:30 2005
@@ -0,0 +1,15 @@
+==============================
+Deliverance
+==============================
+Content deliver for CMS systems
+------------------------------
+
+This is a package for doing content delivery of semi-static CMS
+content using mod_python and lxml.
+
+Background information is available in the doc directory.
+
+Installation instructions are in INSTALL.txt.
+
+Paul Everitt
+paul at zope-europe.org
Added: z3/deliverance/trunk/doc/INTRO.txt
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/doc/INTRO.txt Wed May 18 18:42:30 2005
@@ -0,0 +1,330 @@
+==============================
+Deliverance
+==============================
+Content deliver for CMS systems
+------------------------------
+
+*Note: Work in progress. Some of the ideas, particulary the content
+ map, are in flux.*
+
+CMS systems, particularly in Zope, excel at the structured environment
+of content *production*. This area places a strong emphasis on
+security, workflow, metadata, and other content services.
+
+For content *delivery* on public sites, though, some of this machinery
+is overkill. The framework for content production has a nasty side
+effect of killing performance for content delivery, making reliability
+and debugging a challenge, and forcing other audiences (like web
+designers in charge of look-and-feel) to learn another way to do
+things.
+
+For this reason, many ECM packages make a formal distinction between
+content production and content delivery.
+
+Deliverance is a lightweight, semi-static system for content delivery
+of CMS resources. It runs in mod_python, generating branded pages and
+navigation elements, giving high-performance throughput to anonymous
+visitors. Its primary benefits:
+
+ o High performance
+
+ o Simple re-branding
+
+ o Trusted stack
+
+ o Extreme productivity
+
+It is focused on audiencces that want:
+
+ o Predictable delivery to anonymous visitors
+
+ o Some portion of an airgap (logical/physical) between the CMS and
+ the live site
+
+ o Integration with mainstream systems and technologies
+
+This document discusses how the system works, then revisits the
+benefits in detail.
+
+Overview
+---------
+
+Deliverance has two major parts:
+
+ o *Themes*. These apply a consistent look-and-feel to content that
+ streams through Apache. This content can be on the filesystem, in
+ Zope with mod_proxy, or using the other part of Deliverance. In a
+ nutshell, a theme is an HTML file (plus the CSS, images, etc.)
+ containing boxes that get filled by content.
+
+ o *Content maps*. A description of the content on a site, including
+ metadata and different organization schemes. The content map also
+ has views that, inside Deliverance, can generate HTML for navigation
+ and other purposes.
+
+Each of these can be used without the other.
+
+
+How It Works
+-----------
+
+In a nutshell, Deliverance gets an XML map describing all the
+published content at a point in time. It uses this map to draw
+navigation elements and issue HTTP requests for content of single
+resources. Finally, a "theme" provides the HTML to return with named
+boxes to be filled by rules.
+
+Let's first introduce some major concepts, then walk a request through
+from start to finish, using these concepts.
+
+1) *Theme*. Web designers don't want to learn anything new. ZPT
+tried to embrace this, but by the time the ZPT developer has injected
+all the tal and refactored everything into macros, the web designer
+can't possible continue.
+
+A theme is the corporate identity for a site. It is *not* a template,
+as it has zero stuff in it beyond HTML.
+
+A theme is created by saving the customer's home page and identifying
+the boxes to be replaced. For example, <div id="sitemenu"> identifies
+a place where a generated menu should go. Web designers are familiar
+with this, as CSS uses such selectors to apply style.
+
+Deliverance has a ruleset that does the merge between the theme file
+and the generated content. In essense, this rule file says: "Find
+'site-menu' in the theme and replace its children with the generated
+contents with an id of 'generated-menu'."
+
+The ruleset is under the control of the integrator, who bridges the
+gap between what the CMS provides and what the UI designer makes
+available. This is done, though, without touching anything on either
+side of the equation.
+
+This allows the theme to be applied to all pages, without touching the
+pages. The theme engine uses XSLT (via lxml) to perform the merge.
+
+2) *Map*. By design, content delivery is separated from content
+management. In fact, this separation acts as insulation. At various
+intervals, the CMS makes an "edition" or a snapshot of its contents,
+providing a map with metadata for all the contents that should be
+visible. (In fact, the map could point at a certain *version* of a
+resource that should be visible.)
+
+This map is read by mod_python using lxml. It serves two functions:
+
+a. *Navigation elements*. We can draw site menus and trees without
+visiting the server. Since these can be done in XSLT, not only is the
+performance very good, but we can draw many other kinds of pages. For
+example, we can show all the contents modified in the last week, or
+all the contents in France.
+
+b. *Resource lookup*. The map controls how an incoming, virtual URL
+gets mapped to a real resource. This means the URL space can be
+placeless. Content can appear in multiple places. Equally, content
+from multiple CMSs, even multiple remote hosts, can be integrated into
+the same map.
+
+The identifier used for retrieving the content for the resource can be
+a normal GET or a more complicated QUERY_STRING or even xml-rpc kind
+of lookup.
+
+Note that the contents for many CMS resources are, in fact, very small
+amounts of data. They could be cached inline in the content map and
+not looked up. For frequent pages, this would provide a big win.
+
+Finally, some resources in the map might be virtual, meaning the page
+can be fully rendered in Deliverance. For example, a URL to show all
+the content with the keyword of "CPS" can be serviced without a trip
+to the server. All that is needed is an XSLT rule for generation.
+(Later, the XSLT could be eliminated with a Python extension function
+in lxml.)
+
+3) *Compilation*. The goal is high performance. There are certain
+aspects that never change between requests:
+
+a. The contents of the map.
+
+b. The theme and the rule file for merging.
+
+c. Site configuration, such as site menus.
+
+It makes no sense to re-parse DOMs and stylesheets on each request.
+Equally, it makes no sense to have a multi-stage pipeline when several
+parts never change.
+
+Deliverance gets a tremendous speedup by compiling the theme into a
+stylesheet. It reads the XHTML file for the theme, identifies the
+nodes to be replaced, and generates an XSTL with xsl:value-of and
+xsl:apply-template statements in the right location. Compilation also
+inlines the map data into the XSLT so it doesn't have to included
+later.
+
+Compilation thus gives two benefits:
+
+a. You can re-brand stuff without learning XSLT and without touching
+the HTML of the theme file.
+
+b. Most of the work needed for per-request transformations is done on
+startup. Specifically, we avoid the 50ms hit that the "identity
+transformation" pattern seemed to give.
+
+4) *Retrieval*. mod_python has a Bobo-inspired publisher that walks
+the URL, traversing Python objects using a set of rules.
+
+Deliverance has a similar idea. The URL provides an identifier into
+the map file to retrieve a map item. The map item then gives
+instructions on how to find the content for the page and how to render
+it.
+
+In most cases, some Python code will be issued to retrieve a page from
+the CMS. For this, a very stripped-down skin will be used in the CMS,
+or perhaps no skin at all. For example, the URL in the map file might
+request the DAV view of the resource, thus giving just the data. For
+CMF-based systems, this is a 10x speedup.
+
+In other cases, the map might point to a virtual page, as discussed
+above.
+
+The mapping provides some interesting possibilities for integration.
+First, Deliverance could leverage Apache's infrastructure for
+retrieval and caching. Second, libxml2 has several Python extension
+facilities (XPath functions, custom resolvers) that allow the map to
+act as an integration facility. Simply put some metadata on a map
+entry to make it look like a resource, with the actual retrieval being
+done with custom code.
+
+5) *Generation*. Deliverance does not have a parser of any kind. It
+uses XSLT to generate HTML. As noted above, for important parts of
+usage, no XSLT knowledge is required.
+
+Using XSLT gives some benefits:
+
+ o Extremely optimized.
+
+ o Extremely documented.
+
+ o Rich tool chain.
+
+ o Maintenance burden belongs to others.
+
+XSLT has a negative reputation. Thus, Deliverance works hard to allow
+people to avoid using it, except when they need something custom. For
+example, navigation boxes don't have to be generated by XSLT, they
+could be in the HTML lookup up by the CMS and inserted into the theme.
+
+A Typical Request
+---------------
+
+With that background, how does Deliverance work, end-to-end? The
+following section starts with an Apache restart, finishing with the
+last byte returned to the browser.
+
+*Note: This describes how things will be, not how they currently are.
+ lxml needs some more work for a couple of things mentioned herein.*
+
+First, Apache is started. In the conf file, there is a section that
+maps part of the URL space to a mod_python handler. This handler is
+part of Deliverance.
+
+When the handler module is imported, it performs some one-time
+optimizations on startup:
+
+a. Read the map file, the theme's XHTML, and the site configuration
+into XML DOMs.
+
+b. Read the "blank-compilerdoc" and the compiler stylesheet into a DOM
+and a processor, respectively.
+
+c. Merge everything from (a) into the blank-compilerdoc (later
+replaced by XInclude).
+
+d. Create a compiled theme processor by applying the compiler
+stylesheet against the blank-compilerdoc. The output is, in fact,
+another XSLT stylesheet. Namely, it is a "compiled" stylesheet, ready
+to be applied to each incoming request while doing the least amount of
+work needed.
+
+When a request comes in, Apache passes it off to the Python handler
+function in Deliverance. The handler takes the relevant part of the
+URI and does an XPath lookup in the map, grabbing the node referenced
+by this URI fragment. This map node contains instructions for the
+next two steps:
+
+ o Retrieve the contents.
+
+ o Format the contents.
+
+The handler then retrieves the X(H)TML for the contents and applies
+the compiled stylesheet. The compiled stylesheet has a rule for
+handling anything unique about that resource type.
+
+The results are serialized and returned.
+
+Performance
+-----------
+
+Since much of the information needed for rendering a requests is
+statically contained in a specially-tuned, in-memory DOM, performance
+automatically gets a boost. (This would be the same in Zope.)
+
+The use of XSLT, especially compiled into a well-tuned state, gives
+another big performance win. Many operations, such as drawing a tree
+or site map, fit the XSLT pattern better than ZPT. Also, libxslt is a
+much more actively developed project, used by 1,000x the number of
+people, than ZPT.
+
+Memory usage is likely to be an issue. A content map with 400,000
+entries could occupy 150 Mb of real memory. However:
+
+ o Few sites have 400,000 public resources.
+
+ o Those that do can afford a gigabyte of RAM.
+
+For requests that don't require a trip to the CMS, 130 requests/sec
+should be expected.
+
+Productivity
+-----------
+
+You can speed up a computer by buying a bigger box. How do you speed
+up a programmer? Unfortunately, Zope has accumulated layers and layer
+of idiosyncratic frameworks. Some of this is hidden from the
+integrator and web designer, but some of it peeks through.
+
+Deliverance is a massive increase in UI productivity. First and
+foremost, the entire UI can be developed outside of the CMS, using
+static models on disk. As long as the CMS returns XML that looks the
+same as the sample documents and sample content map, everything should
+just work.
+
+Second, this approach gives multiple tools in the toolchain. I like
+using Oxygen, a cheap but amazing XML/XSLT authoring environment. I
+can edit the dynamic UI with files on disk, press a button, and see
+what it will look like when rendered. If there is an error, I get a
+useful (non-ZPT!) error message, with the cursor sitting on the
+offending line. I even get a stepwise debugger, where I can watch the
+output get rendered and set a breakpoint to see the evaluation
+context.
+
+Alternatively, someone can run an xsltproc command like this:
+
+xsltproc compiler.xsl blank-compiled.xml | xsltproc - ../tests/sampledoc1.xml
+
+...and see what the page will look like. Finally, the simple Python
+scripts in Deliverance can be run from the command line to process
+real output in the map. Each part of the process can be inspected to
+find the offending problem.
+
+More generally, the XML+XSLT approach is fundamentally easier. In
+ZPT, the data model is exposed via baroque, undocumented APIs
+appearing in TAL expressions. In XML, you just look at the file and
+visually see the data model. XPath gives a wonderful, simple, but
+powerful way to manipulate the data model. And although XSLT is
+baroque, so is the messy pile of deconstructed macros and slots
+appearing ad-hoc in most large-scale Zope apps.
+
+This approach gives other kinds of productivity. For example, there
+are tons of books, and Google has an answer to every question you
+might have. Why? Because the installed base of XML and XSLT is four
+orders of magnitude higher than Zope+CMF+ZPT+[CPS/Plone/Silva].
+
Added: z3/deliverance/trunk/examples/plonenet/content/compiled-plonenettheme.xml
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/examples/plonenet/content/compiled-plonenettheme.xml Wed May 18 18:42:30 2005
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output indent="yes" method="html"/>
+ <themerules xmlns="http://www.zope.org/deliverance" xml:base="../etc/themerules.xml">
+ <rule docxpath="/html:html/html:head/html:title/text()" themeid="title"/>
+ <rule docxpath="/html:html/html:head/html:title/text()" themeid="page-heading"/>
+ <rule docxpath="/html:html/html:body//html:div[@id='content-body']/*" themeid="content-body"/>
+ </themerules>
+ <xsl:template match="/">
+ <html xml:lang="en" lang="en" xml:base="../content/plonenettheme.xml">
+ <head>
+ <title id="title">
+ <xsl:copy-of select="/html:html/html:head/html:title/text()"/>
+ </title>
+<!-- compliance patch for microsoft browsers -->
+ <script src="/staticplone.net/ie7/ie7-standard.js" type="text/javascript">//</script>
+ <link type="text/css" rel="stylesheet" href="/staticplone.net/plonenet.css"/>
+ </head>
+ <body>
+ <div id="header">
+ <div id="masthead">
+ <img src="/staticplone.net/site_icon.gif" alt="menu"/>
+ <span id="page-heading">
+ <xsl:copy-of select="/html:html/html:head/html:title/text()"/>
+ </span>
+ </div>
+ <div id="menu">
+ <a href="/plone.net/index">home</a>
+ <a href="/plone.net/providers">providers</a>
+ <a href="/plone.net/casestudies">case studies</a>
+ <a href="/plone.net/links">links</a>
+ <a href="/plone.net/about">about</a>
+ </div>
+ </div>
+ <div id="content-body">
+ <xsl:copy-of select="/html:html/html:body//html:div[@id='content-body']/*"/>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
Added: z3/deliverance/trunk/examples/plonenet/content/echo123.xml
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/examples/plonenet/content/echo123.xml Wed May 18 18:42:30 2005
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>plone.net Sample Site</title>
+ </head>
+ <body>
+ <div id="content-body">
+ <h1>echo123 Sample Document</h1>
+ <p>This is a test document to be used as input to test the
+ theme filter for <em>Deliverance</em>.</p>
+ </div>
+ </body>
+</html>
\ No newline at end of file
Added: z3/deliverance/trunk/examples/plonenet/content/index.xsl
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/examples/plonenet/content/index.xsl Wed May 18 18:42:30 2005
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:office="http://openoffice.org/2000/office">
+ <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.1//EN"
+ doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
+ <xsl:variable name="viewname">providers</xsl:variable>
+ <xsl:variable name="viewarg">bycountry</xsl:variable>
+ <xsl:template match="/">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>
+ <xsl:value-of select="/workbook/office:meta/dc:title"/>
+ </title>
+ </head>
+ <body>
+ <div>
+ <span id="page-heading">
+ <xsl:value-of select="/workbook/office:meta/dc:title"/>
+ </span>
+ </div>
+ <div id="content-body">
+ <xsl:apply-templates select="workbook" mode="about"/>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template match="workbook" mode="index">
+ <div id="news">
+ <h2>News</h2>
+ <ul>
+ <xsl:for-each select="tables/table[@id='News']/data/row">
+ <li title="{cell[4]}">
+ <xsl:value-of select="cell[3]"/>
+ </li>
+ </xsl:for-each>
+ </ul>
+ </div>
+ <p>plone.net is some static information collects all the business information for Plone into a well-organized,
+ professional resource for decision-makers.</p>
+ <p>This Plone Foundation website ...</p>
+ </xsl:template>
+ <xsl:template match="workbook" mode="todo">
+ <h2>To Do Items</h2>
+ <xsl:for-each select="tables/table[@id='Todo']/data/row">
+ <div><xsl:value-of select="cell[2]"/></div>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template match="workbook" mode="about">
+ <h2>About plone.net</h2>
+ </xsl:template>
+ <xsl:template match="workbook" mode="providers">
+ <xsl:choose>
+ <xsl:when test="$viewarg='bycountry'">
+ <h3>Providers sorted by country</h3>
+ <div>(sort <a href="/plone.net/providers">by company name</a>)</div>
+ <xsl:apply-templates select="tables/table[@id='Companies']/data/row" mode="provider">
+ <xsl:sort select="cell[5]"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <h3>Providers sorted alphabetically</h3>
+ <div>(sort <a href="/plone.net/providers/bycountry">by country</a>)</div>
+ <xsl:apply-templates select="tables/table[@id='Companies']/data/row" mode="provider"
+ />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match="row" mode="provider">
+ <div class="provider">
+ <xsl:if test="cell[8]">
+ <!--<img src="{cell[8]}" alt="{cell[2]}"/>-->
+ </xsl:if>
+ <h4>
+ <xsl:value-of select="cell[2]"/>
+ </h4>
+ <div>Country: <xsl:value-of select="cell[5]"/>
+ </div>
+ <div>
+ <xsl:value-of select="cell[3]"/>
+ </div>
+ </div>
+ </xsl:template>
+ <xsl:template match="workbook" mode="casestudies">
+ <h2>Case Studies</h2>
+ </xsl:template>
+ <xsl:template match="workbook" mode="links">
+ <h2>Links</h2>
+ </xsl:template>
+ <xsl:template match="table">
+ <table>
+ <tr>
+ <xsl:for-each select="columns/column">
+ <th>
+ <xsl:value-of select="."/>
+ </th>
+ </xsl:for-each>
+ </tr>
+ <xsl:for-each select="data/row">
+ <tr>
+ <xsl:for-each select="cell">
+ <td>
+ <xsl:if test=".">
+ <xsl:value-of select="."/>
+ </xsl:if>
+ </td>
+ </xsl:for-each>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+</xsl:stylesheet>
Added: z3/deliverance/trunk/examples/plonenet/content/pfdata.sxc
==============================================================================
Binary file. No diff available.
Added: z3/deliverance/trunk/examples/plonenet/content/plonenettheme.xml
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/examples/plonenet/content/plonenettheme.xml Wed May 18 18:42:30 2005
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title id="title">plone.net Sample Title</title>
+ <!-- compliance patch for microsoft browsers -->
+ <script src="/staticplone.net/ie7/ie7-standard.js" type="text/javascript">//</script>
+ <link type="text/css" rel="stylesheet" href="/staticplone.net/plonenet.css"/>
+ </head>
+ <body>
+ <div id="header">
+ <div id="masthead">
+ <img src="/staticplone.net/site_icon.gif" alt="menu"/>
+ <span id="page-heading">
+ This is a sample page heading. It will be replaced.
+ </span>
+ </div>
+ <div id="menu">
+ <a href="/plone.net/index">home</a>
+ <a href="/plone.net/providers">providers</a>
+ <a href="/plone.net/casestudies">case studies</a>
+ <a href="/plone.net/links">links</a>
+ <a href="/plone.net/about">about</a>
+ </div>
+ </div>
+ <div id="content-body">
+ <p>This is sample content. It will be replaced.</p>
+ </div>
+ </body>
+</html>
Added: z3/deliverance/trunk/examples/plonenet/content/tmp/content.xml
==============================================================================
--- (empty file)
+++ z3/deliverance/trunk/examples/plonenet/content/tmp/content.xml Wed May 18 18:42:30 2005
@@ -0,0 +1,1925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document-content xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style" xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table" xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart" xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script" office:class="spreadsheet" office:version="1.0">
+ <office:script/>
+ <office:font-decls>
+ <style:font-decl style:name="Arial1" fo:font-family="Arial" style:font-pitch="variable"/>
+ <style:font-decl style:name="Lucida Grande"
+ fo:font-family="'Lucida Grande'" style:font-pitch="variable"/>
+ <style:font-decl style:name="Arial" fo:font-family="Arial" style:font-family-generic="swiss"
+ style:font-pitch="variable"/>
+ </office:font-decls>
+ <office:automatic-styles>
+ <style:style style:name="co1" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="1.0484inch"/>
+ </style:style>
+ <style:style style:name="co2" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="2.011inch"/>
+ </style:style>
+ <style:style style:name="co3" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="0.8925inch"/>
+ </style:style>
+ <style:style style:name="co4" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="1.7839inch"/>
+ </style:style>
+ <style:style style:name="co5" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="1.4382inch"/>
+ </style:style>
+ <style:style style:name="co6" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="2.5409inch"/>
+ </style:style>
+ <style:style style:name="co7" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="2.339inch"/>
+ </style:style>
+ <style:style style:name="co8" style:family="table-column">
+ <style:properties fo:break-before="auto" style:column-width="2.5543inch"/>
+ </style:style>
+ <style:style style:name="ro1" style:family="table-row">
+ <style:properties style:row-height="0.1783inch" fo:break-before="auto"
+ style:use-optimal-row-height="true"/>
+ </style:style>
+ <style:style style:name="ro2" style:family="table-row">
+ <style:properties style:row-height="0.1862inch" fo:break-before="auto"
+ style:use-optimal-row-height="true"/>
+ </style:style>
+ <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
+ <style:properties table:display="true"/>
+ </style:style>
+ <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default">
+ <style:properties fo:border="none"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <table:table table:name="Companies" table:style-name="ta1">
+ <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co2" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co3" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co4" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co3" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co5" table:default-cell-style-name="Default"/>
+ <table:table-column table:style-name="co3" table:number-columns-repeated="5"
+ table:default-cell-style-name="Default"/>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>id</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>title</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>description</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>contactName</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>country</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>contactEmail</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>url</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>logo</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>industry</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>rating</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>isSponsor</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro2">
+ <table:table-cell table:number-columns-repeated="2">
+ <text:p>Enfold</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>A US-based</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Alan Runyan</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="2" table:value-type="float"
+ table:value="1">
+ <text:p>1</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="4"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro2">
+ <table:table-cell>
+ <text:p>Psol</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Plone Solutions</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Norwegian-based</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Alex Limi</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NO</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="2"/>
+ <table:table-cell>
+ <text:p>http://www.plonesolutions.com/logo.jpg</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="2"/>
+ <table:table-cell table:value-type="float" table:value="1">
+ <text:p>1</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro2">
+ <table:table-cell>
+ <text:p>Struktur</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Struktur</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Stuttgart</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Niels Mache</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Myemail</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Myurl</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Myindustry</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>1</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Ingeniweb</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Ingeniweb</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Olivier Deckmyn</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>FR</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Objectreamls</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ObjectRealms</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Ben Saller</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Bd</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BlueDynamics</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Robert Boulanger</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>AT</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Netalley</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NetAlley Networks</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Michael Zeltner</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zopechina</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ZopeChina Corporation</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell table:style-name="ce1">
+ <text:p>Junyong Pan</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>China</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Telesis</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Telesis</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jodok Batlogg</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>AT</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Bubblenet</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Bubblenet</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Godefroid Chapelle</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Redchor</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Redchor</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Robert Rotterman</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>CH</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Pilot</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Pilot Systems</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>David Sapiro</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>FR</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Getfrank</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>GetFrank</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Seb Potter</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell table:number-columns-repeated="2">
+ <text:p>4teamwork</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Bernhard Buhlmann</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>CH</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Upfront</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Upfront Systems</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Joris Goudriaan</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ZA</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Reflab</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Reflab</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Francesco Ciriaci</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>IT</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zea</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zope Europe Association</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Paul Everitt</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zopejapan</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zope Japan</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Takeshi Yamamoto</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>JA</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Gocept</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Gocept</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Christian Theune</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Netsight</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Netsight</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Matt Hamilton</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zest</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zest Software</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jean-Paul Ladage</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NL</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Headnet</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Headnet Aps</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Sune Toft</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zopyx</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ZOPYX</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Andreas Jung</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Ca</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Computer Associates</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Marcel den Hartog</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Tyrell</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Tyrell Software</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Mark Murphy</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Klein</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Klein & Partner KEG</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jens Klein</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zeta</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zeta Design and Development</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Chad Whitacre</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Csquared</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>C Squared Technologies</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Donna Snow</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Comloung</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>COM.lounge GbR</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Christian Heimes</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Cignex</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>CIGNEX</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Amit Babaria</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Sixfeet</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Six Feet Up</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Calvin Hendryx-Parker</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Suveg</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>SUVEG IT</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Gabor Suveg</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Tomcom</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Tomcom GmbH</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Thomas Zeleny</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Quinta</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Quintagroup</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Myroslav Opyr</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Roepcke</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Roepcke Computing Solutions</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jim Roepcke</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Weimar</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Weimar Consultoria</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Fabiano Weimar dos Santos</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Exoweb</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Exoweb</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Fernando Martins</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Pn</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Porter Novelli</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Barry Reicherter</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Refactor</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Refactor</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Leonard Norrgard</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Ldr</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>LDR informatics</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Laurence Rowe</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Svhs</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Systemvaruhuset</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Sasha Vincic</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Eis</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Extreme internet solutions</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Andrew Mleczko</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Poland</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Etria</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Etria, LLP</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Tom von Schwerdtner</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Simplistix</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Simplistix Ltd</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Chris Withers</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Redomino</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Redomino</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Giuseppe Masili</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>IT</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Sagewerks</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Sagewerks Marketing Ltd.</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Andrew Coates</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>CA</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Spri</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>SPR Inc.</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Ken Wasetis</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Abstractedge</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Abstract Edge</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Scott Paley</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Nba</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NB&A srl</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Aldo Bergamini</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Faith</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Faith Online Ltd.</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Gerry Kirk</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Atreal</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Atreal</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Thierry Benita</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>FR</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Bmc</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BMC</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Ricardo Mendes</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Portugal</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Eduplone</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>EduPlone</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Georg Pleger</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>AT</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Keysol</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Key Solutions</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Mikhail Kashkin</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>RU</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Aixtra</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>AixtraWare</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Joachim Schmitz</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Sw</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Solution Workshops</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Russ Ferriday</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="7"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Acsr</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ACSR industrialdesign</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Armin Stross-Radschinski</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Mahiti</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Mahiti</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Sunil Abraham</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>India</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Noiza</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Noiza</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Enzo Cesanelli</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Italy</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zeomega</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zeomega</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Rangaswamy Sathya</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Openweb</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>OpenWeb Systems</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Mike Mathias</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Arche</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>ARCHE AG</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Thorsten Harms</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Binaryp</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>binaryPeople</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Gidon Friedman</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>CH</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Serpro</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>SERPRO</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Giuseppe Romagnoli</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BR</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Starsky</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Starsky Consultants Ltd</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Ragnar Heil</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell table:number-columns-repeated="2">
+ <text:p>Amaze</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Ivo van der Wijk</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NL</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Seventech</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>7 Tech Northwest</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Richard Amerman</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>US</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Lp</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Logical Progression Ltd</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Andrew Veitch</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell table:number-columns-repeated="2">
+ <text:p>Pareto</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jan Murre</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>NL</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Zetwork</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>Zetwork</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Jens Vagelpohl</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>DE</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Bf</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>BlueFountain</text:p>
+ </table:table-cell>
+ <table:table-cell/>
+ <table:table-cell>
+ <text:p>Aidan McGuire</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>UK</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="6"/>
+ </table:table-row>
+ </table:table>
+ <table:table table:name="People" table:style-name="ta1">
+ <table:table-column table:style-name="co6" table:default-cell-style-name="ce1"/>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>alan runyan </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Alexander Limi </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Christian Heimes </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Sidnei da Silva </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Stefan H. Holek </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Simon Eisenmann </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Geoff Davis </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Helge Tesdal </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>P.-J. Grizel </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Andy McKay </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Daniel Nouri </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Lalo Martins </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Benjamin Saller </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Thenault Sylvain <text:s text:c="2"/>
+ </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Philipp Auersperg </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Magnus Heino </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Geir Bækholt </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Dorneles Treméa </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Leonard Norrgard </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Michael Zeltner </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Jens Klein </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Andreas Jung </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Kapil Thangavelu </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Ronan Amicel </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Gerry Kirk </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Maik Röder </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>panjunyong </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Jodok Batlogg </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Godefroid Chapelle </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>J M Cerqueira Esteves</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Vladimir Iliev </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Fabiano Weimar dos Santos </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>robert rottermann </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Lele Gaifax</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Brent Hendricks </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>James Cooper </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Tom Croucher </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>André Ribeiro Camargo</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Cyrille Lebeaupin</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Bill Schindler </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Danny Bloemendaal </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Kamon Ayeva </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Dominik B. </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Pedro A. Gracia Fajardo</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Anoush Najarian </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Mai Kozakai</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Jim Roepcke </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Jochen Knuth </text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1">
+ <table:table-cell>
+ <text:p>Joel Burton </text:p>
+